嵌套用于填充数组的循环

时间:2014-11-12 21:53:55

标签: python list loops combinations

我正在学习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]

这是可能组合的列表,但如果我尝试额外的for循环来索引它们,它似乎不起作用,只给出第一个元素。我正试图在表单中获得一个数组:

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

我可以索引所述数组并获取Array[0] == [0,0]等等。

有关如何执行此操作的任何提示?我试过for循环并使用append函数既没有给我想要的结果。

4 个答案:

答案 0 :(得分:2)

您可以将结果附加到结果中:

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 :(得分:2)

我喜欢list comprehension

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

但它在python 2.7中创建了三个列表(迭代的两个留在内存中),这是现在常见的一个。

如果您使用大值,请尝试:

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

使用Generators:)

答案 2 :(得分: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]
>>>

请注意,此解决方案也非常灵活。例如,如果您想要一次三个地找到一到五的数字组合,您需要做的就是更改给rangerepeat的数字:

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

答案 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]]