我正在学习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函数既没有给我想要的结果。
答案 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)
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]
>>>
请注意,此解决方案也非常灵活。例如,如果您想要一次三个地找到一到五的数字组合,您需要做的就是更改给range
和repeat
的数字:
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]]