Подтвердить что ты не робот

Перечисление трех переменных в понимании списка python

Я пытаюсь напечатать все возможные перечисления списка для трех переменных. Например, если мой вход:

x = 1
y = 1
z = 1

Я хочу, чтобы результат был следующим:

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 1, 0], [1, 0, 1], [0, 1, 1], [1, 1, 1]]

Если какая-либо из переменных x, y, z выше 1, она будет перечислять все целые числа от 0 до значения переменной. Например, если x = 3, то 0, 1, 2 или 3 будут возможны в первом слоте списков из 3 элементов.

В настоящее время я создаю понимание списка следующим образом:

output = [ [x,y,z] for x,y,z in range(x,y,z)]

Я думаю, что что-то не так с функцией диапазона?

4b9b3361

Ответ 1

В дополнение к решениям, использующим product, вы также можете использовать тройное понимание списка.

>>> x, y, z = 1, 2, 3
>>> [(a, b, c) for a in range(x+1) for b in range(y+1) for c in range(z+1)]
[(0, 0, 0),
 (0, 0, 1),
 (0, 0, 2),
 (some more),
 (1, 2, 2),
 (1, 2, 3)]

+1 необходимо, так как range не включает верхнюю границу. Если вы хотите, чтобы результат был списком списков, вы можете просто сделать [[a, b, c] for ...].

Обратите внимание, однако, что это, очевидно, будет работать только при наличии трех переменных (x, y, z), а product будет работать с произвольным количеством списков/верхних пределов.

Ответ 2

Вы можете использовать функцию product() от itertools следующим образом:

from itertools import product

answer = list(list(x) for x in product([0, 1], repeat=3))
print(answer)

Выход

[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]

Ответ 3

Вы можете использовать функцию range() в понимании списка и itertools.product:

>>> x = 1
>>> y = 1
>>> z = 1
>>> from itertools import product
>>> list(product(*[range(i+1) for i in [x,y,z]]))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]

Этот подход будет работать и для разных чисел:

>>> x = 2
>>> y = 2
>>> z = 2
>>> 
>>> list(product(*[range(i+1) for i in [x,y,z]]))
[(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 2, 0), (0, 2, 1), (0, 2, 2), (1, 0, 0), (1, 0, 1), (1, 0, 2), (1, 1, 0), (1, 1, 1), (1, 1, 2), (1, 2, 0), (1, 2, 1), (1, 2, 2), (2, 0, 0), (2, 0, 1), (2, 0, 2), (2, 1, 0), (2, 1, 1), (2, 1, 2), (2, 2, 0), (2, 2, 1), (2, 2, 2)]
>>> 

Ответ 4

Если вам это нужно в виде списка списков (вместо списка кортежей), вы можете использовать map для вывода ответа Kasramvd, то есть:

map(list,list(product(*[range(i+1) for i in [x,y,z]])))