【问题标题】:python input for itertools.productitertools.product 的 python 输入
【发布时间】:2011-03-02 12:44:56
【问题描述】:

在寻找一种模拟嵌套循环(或笛卡尔积)的方法时,我遇到了 itertools.product 函数。 我需要一个函数或一段代码来接收整数列表作为输入并返回一个特定的生成器。

示例:
输入 = [3,2,4] -> gen = product(xrange(3),xrange(2),xrange(4))

输入 = [2,4,5,6] -> gen = product(xrange(2),xrange(4),xrange(5),xrange(6))

由于列表的大小各不相同,我很困惑如何做到这一点,而不需要基于大量的 if 和列表的大小进行大量预编码。

调用product(range(3))和product(xrange(3))也有区别吗?

【问题讨论】:

    标签: python


    【解决方案1】:
    def bigproduct(*args):
      newargs = [xrange(x) for x in args]
      return itertools.product(*newargs)
    
    for i in bigproduct(3, 2, 4):
       ....
    

    range() 预先生成一个列表,因此预先使用时间和更多空间,但获取每个元素所需的时间更少。 xrange() 动态生成每个元素,因此占用的空间和初始时间更少,但返回每个元素需要更多时间。

    【讨论】:

    • +1 让我添加两个细节:1) 在 Python 3 中,range() 的行为类似于 xrange() 2) 在 Python 2 的 CPython 实现中,xrange 仅限于 C @987654327 @ 数据类型(即xrange(int(2**31-1)) 通常是最大范围)。打那个一次...
    【解决方案2】:

    这可以使用地图轻松完成:

    from itertools import product
    for i in product(*map(range, shape)):
        print i
    

    【讨论】:

    • 什么是shape?这是特定于 numpy 的参考吗?
    猜你喜欢
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多