【问题标题】:Pythonic shortcut for doubly nested for loops?双重嵌套for循环的Pythonic快捷方式?
【发布时间】:2011-03-28 16:25:16
【问题描述】:

考虑如果我有一个接受元组参数 (x,y) 的函数,其中 x 在范围 (X) 中,y 在范围 (Y) 中,通常的做法是:

for x in range(X):
    for y in range(Y):
        function(x,y)

有办法吗

for xy in something_like_range(X,Y):
    function(xy)

这样 xy 是一个元组 (x,y)?

【问题讨论】:

    标签: python for-loop tuples nested-loops


    【解决方案1】:

    您可以使用product from itertools

    >>> from itertools import product
    >>> 
    >>> for x,y in product(range(3), range(4)):
    ...   print (x,y)
    ... 
    (0, 0)
    (0, 1)
    (0, 2)
    (0, 3)
    (1, 0)
    (1, 1)
    (1, 2)
    (1, 3)
    
    ... and so on
    

    您的代码如下所示:

    for x,y in product(range(X), range(Y)):
        function(x,y)
    

    【讨论】:

      【解决方案2】:

      你可以使用itertools.product():

      from itertools import product
      for xy in product(range(X), range(Y)):
          function(xy)
      

      【讨论】:

      • 不需要逗号 b/w x 和 y?
      • @yishairasowsky 代码按照编写的方式工作。 xy 将是一对(具有两个元素的元组),在每次迭代中包含来自X 的一个值和来自Y 的一个值。如果需要,可以使用 x, y 作为循环变量来解压元组。我在这里使用 xy 作为单个值,因为这是 OP 要求的。
      【解决方案3】:

      它们是 Pythonic ->(根据您的要求修改

      >>> [ (x,y)   for x in range(2)   for y in range(2)]
      [(0, 0), (0, 1), (1, 0), (1, 1)]
      

      生成器版本

      gen = ( (x,y)   for x in range(2)   for y in range(2) )
      >>> for x,y in gen:
      ...     print x,y
      ... 
      0 0
      0 1
      1 0
      1 1
      

      【讨论】:

        【解决方案4】:

        从 itertools 试用产品:http://docs.python.org/library/itertools.html#itertools.product

        from itertools import product
        
        for x, y in product(range(X), range(Y)):
            function(x, y)
        

        【讨论】:

          【解决方案5】:
          from itertools import product
          
          def something_like_range(*sizes):
              return product(*[range(size) for size in sizes])
          

          用于接近您想要的用法:

          for x,y in something_like_range(X,Y):
              your_function(x,y)
          

          =)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-08
            • 2013-05-06
            • 2019-05-21
            • 2017-08-20
            • 2013-10-20
            • 2016-02-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多