【问题标题】:How to iterate over two different-size lists to get a new list?如何遍历两个不同大小的列表以获得新列表?
【发布时间】:2013-10-24 02:47:35
【问题描述】:

现在我想建立一个包含100*50 2-D 点的列表。我尝试了以下方法:

[(x+0.5, y+0.5) for x, y in zip(range(100), range(50))]

这只给我50*50分。我在this answer 中找到了原因,指出了

对于 zip,新列表的长度与最短列表的长度相同。

正确获得我想要的100*50 点的最 Pythonic 方法是什么?

【问题讨论】:

  • 使用 itertools.izip_longest()
  • 为了将来参考,您正在寻找笛卡尔积,而不是锁步迭代。

标签: python


【解决方案1】:

嗯,我想你想要itertools.product 而不是zip

itertools.product 计算两个列表的笛卡尔积,并给出总分 100*50。

你会这样做的方式是

import itertools
[(x+0.5,y+0.5) for x,y in itertools.product(range(100),range(50))]

您也可以这样做,嵌套 for 循环,但总的来说,我会说 itertools.product 更具可扩展性和更 Python 化(扁平比嵌套更好)

【讨论】:

    【解决方案2】:

    x 需要一个循环,y 需要一个循环:

    >>> points = [(x+0.5, y+0.5) for x in xrange(100) for y in xrange(50)]
    >>> len(points)
    5000
    >>> 100 * 50
    5000
    

    【讨论】:

      【解决方案3】:

      两个循环。

      [(x+0.5, y+0.5) for x in range(100) for y in range(50))]
      

      【讨论】:

        【解决方案4】:

        这是一种添加较少的方法(仅 150 与 5000 相比)

        >>> from itertools import product
        >>> list(product(map(.5.__add__, range(100)), map(.5.__add__, range(50))))
        [(0.5, 0.5), (0.5, 1.5), (0.5, 2.5), (0.5, 3.5), (0.5, 4.5), (0.5, 5.5), (0.5, 6.5), (0.5, 7.5), (0.5, 8.5), (0.5, 9.5),...
        

        【讨论】:

          【解决方案5】:

          你也可以使用 numpy.meshgrid:

          import numpy as np
          x, y = np.meshgrid(np.arange(0,100,1),np.arange(0,50,1))
          

          【讨论】:

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