2014-11-12 3 views
0

Я изучаю вложенные петли Python, но не мог использовать вложенные циклы, чтобы заполнить список комбинациями. До сих пор яВложенные петли для заполнения массива

for i in range(3): 
    for j in range(3): 
     paths = [i,j] 
     print paths 

Когда это печатает я получаю:

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

Какой список возможных комбинаций, но если я пытаюсь дополнительный для цикла индексировать их не кажется, работать и дает только первый элемент. Я пытаюсь получить массив в форме:

Array = [[0,0], [0,1]... [2,2]] 

, где я могу индекс сказал массив и получить Array[0] == [0,0] и так далее.

Любые подсказки о том, как это сделать? Я пробовал использовать for-loops и использовать функцию append, не давая мне результатов, которые я хотел.

ответ

1

вы можете добавить списки к результату:

result = [] 
for i in range(3): 
    for j in range(3): 
     paths = [i,j] 
     result.append(paths) 
     print paths 

print result 

Это говорит: создать список результатов [] и добавить значение к нему paths на каждом шагу. После этого вы получите список списков, и вы можете получить доступ к первому элементу как result[0] (что действительно [0, 0]).

1

Самый простой способ сделать это состоит в использовании itertools.product:

>>> from itertools import product 
>>> combos = [list(x) for x in product(range(3), repeat=2)] 
>>> combos 
[[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]] 
>>> combos[0] 
[0, 0] 
>>> combos[1] 
[0, 1] 
>>> combos[8] 
[2, 2] 
>>> 

Обратите внимание, что это решение является очень гибким. Например, если вы хотите, чтобы найти комбинации чисел от одного до пяти, взятых три в то время, все, что вам нужно сделать, это изменить номера, данные range и repeat:

combos = [list(x) for x in product(range(6), repeat=3)] 
#          ^  ^
0

Вы можете достичь его с помощью itertools :

>>> import itertools 
>>> list(itertools.product(range(3), range(3))) 
[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)] 

Если вам действительно нужны списки вместо кортежей:

>>> import itertools 
>>> list(itertools.product(range(3), range(3))) 
>>> [list(t) for t in itertools.product(range(3), range(3))] 
[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2], [2, 0], [2, 1], [2, 2]] 
2

Мне нравится list comprehension!

print [[x, y] for x in range(3) for y in range(3)] 

Но он создает три списка (итерированные два пребывания в памяти) в Python 2.7, который является общим один Nowdays.

Если вы используете большие значения, попробуйте следующее:

print [[x, y] for x in xrange(3) for y in xrange(3)] 

который использует Generators :)

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