2016-01-18 2 views
12

Я пытаюсь напечатать все возможные перечисления списка для трех переменных. Например, если мой вход:Перечисление трех переменных в понимании списка 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]] 

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

Сейчас я создаю список понимание, как это:

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

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

+0

Хочет выход в именно этот порядок? И если да, как будет порядок для более сложного ввода? –

+0

Я не занимаюсь порядком, но хотел бы, чтобы он был доступен для не двоичных значений переменных, так что, если бы x = 2, были бы списки, такие как [2,0,0] [2,0,1 ], [2,1,0], [2,1,1] на выходе. –

ответ

8

В дополнение к решениям с помощью 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 будет работать с произвольным числом списков/верхние пределы.

14

Вы можете использовать функцию 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]] 
+0

На самом деле, хотелось бы, чтобы переменные, возможно, также не были бинарными, поэтому, если x = 2, y = 1, z = 1, в результате могут также появляться списки, такие как [2,1,1] ... способ сделать ваше решение с использованием переменных x, y и z вместо жесткого кодирования 1 и 0? –

+0

Рад помочь, но, вероятно, лучше всего, если вы поместите его в отдельный вопрос, так как это, вероятно, требует немного другого подхода! – gtlambert

+0

Зачем конвертировать потом?Просто сделайте то же самое, прежде чем преобразовать генератор 'product' в список, например. '[list (x) для x в продукте (...)]' или 'list (map (list, product (...))' –

6

Вы можете использовать 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)] 
>>> 
+0

Есть ли способ получить результат в виде списков, а не кортежей? –

+0

@WilliamRoss Да, вы можете использовать понимание списка вместо функции 'list'.' [list (item) для элемента в продукте (* [диапазон (i + 1) для i в [x , y, z]])] ' – Kasramvd

3

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

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

1) в Python 3,' map' создает генератор, а не список, и 2) нет необходимости превращать генератор, возвращенный 'product' в список, прежде чем передавать его на карту '. Таким образом, это скорее должно быть «list (map (list, product (...))' –

Смежные вопросы