【问题标题】:Nested For Loops To Fill An Array嵌套 For 循环以填充数组
【发布时间】:2015-01-09 22:01:53
【问题描述】:

我正在学习 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 函数都没有给我想要的结果。

【问题讨论】:

    标签: python list loops combinations


    【解决方案1】:

    我喜欢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】:

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

      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])。

      【讨论】:

        【解决方案3】:

        最简单的方法是使用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]
        >>>
        

        请注意,此解决方案也非常灵活。例如,如果您想一次找出从 1 到 5 的数字组合,只需将给定的数字更改为 rangerepeat

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

        【讨论】:

          【解决方案4】:

          你可以使用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]]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多