Упрощение выражения с помощью 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]]