Упрощение выражения с помощью list comprehenshions

Возможно ли сделать всё это в одной строчке в виде list comprehension?

field = [["1" for _ in range(2)] for _ in range(5)]
for a in range(5):
    field[a].insert(random.randint(0, 2), "0")

Ответы (4 шт):

Автор решения: Павел

Конкретно ваш код с методом insert невозможно записать в виде list comprehenshion, поскольку insert, а так же append и ещё другие методы изменяют исходный список, а не возвращают новый, поэтому если мы захотим написать как-то так:

field = [["1" for _ in range(2)].insert(random.randint(0, 2), "0") for _ in range(5)]
print(field)

То мы ожидаемо увидим вывод:

[None, None, None, None, None]

Но вполне можно написать другой код, который делает то же самое.

Например, так:

import itertools
import random

field = [list(x) for x in random.choices(list(itertools.permutations(['1', '1', '0'])), k=5)]

print(field)

Тогда мы увидим нужный нам результат:

[['1', '1', '0'], ['1', '0', '1'], ['1', '1', '0'], ['1', '0', '1'], ['0', '1', '1']]
→ Ссылка
Автор решения: CrazyElf

Получилось не очень красиво, но да, можно записать это всё в списочное сокращение, если использовать срезы:

field = [(lambda x: ['1','1'][:x]+['0']+['1','1'][x:])(random.randint(0, 2)) for _ in range(5)]

Пример вывода:

[['1', '1', '0'],
 ['1', '1', '0'],
 ['0', '1', '1'],
 ['1', '0', '1'],
 ['1', '0', '1']]
→ Ссылка
Автор решения: splash58

можно сразу заготовить все три варианта и выбирать случайный

field = [list(['110', '101', '011'][random.randint(0, 2)]) for _ in range(5)]
→ Ссылка
Автор решения: SergFSM

random.sample нам в помощь:

from random import sample

[sample([1,0], 3, counts=[2,1]) for _ in range(5)]

>>>
[[0, 1, 1], [1, 1, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1]]
→ Ссылка