【问题标题】:Python nested looping IdiomPython 嵌套循环成语
【发布时间】:2012-12-02 20:11:41
【问题描述】:

我经常发现自己这样做:

for x in range(x_size):
    for y in range(y_size):
        for z in range(z_size):
            pass # do something here

在 Python 中是否有更简洁的方法来执行此操作?我正在考虑类似的事情

for x, z, y in ... ? :

【问题讨论】:

    标签: python loops for-loop foreach idioms


    【解决方案1】:

    如果您已经将 numpy 作为依赖项,那么 numpy.ndindex 就可以解决问题...

    >>> for x,y,z in np.ndindex(2,2,2):
    ...     print x,y,z
    ... 
    0 0 0
    0 0 1
    0 1 0
    0 1 1
    1 0 0
    1 0 1
    1 1 0
    1 1 1
    

    【讨论】:

    • 嗯...显然这与itertools.product 的作用相同。应该看到那个来了... :-)
    • 我喜欢这个解决方案!它真的很简洁,虽然它更像是numpy 成语而不是 python 成语。
    • @Bakuriu -- 我认为没有numpypython 只是一个闪亮的玩具......但我知道这不是每个人的观点:-)。
    【解决方案2】:

    你可以使用itertools.product:

    >>> for x,y,z in itertools.product(range(2), range(2), range(3)):
    ...     print x,y,z
    ... 
    0 0 0
    0 0 1
    0 0 2
    0 1 0
    0 1 1
    0 1 2
    1 0 0
    1 0 1
    1 0 2
    1 1 0
    1 1 1
    1 1 2
    

    【讨论】:

    • 谢谢。我最终选择了一条不同的路线,因为我不能使用 itertools,但是,在查看了 itertools 的文档之后,这正是我所需要的。
    • 值得注意的是,itertools.product 的一大优点是它不会创建中间列表,这将涉及大量追加以及在幕后调整数组大小和内存操作。因此,这个版本不仅优雅,而且在垃圾收集器上也更快、更容易!如果您的嵌套循环在分析时占用了您的大量运行时间,那么这种方法值得尝试。
    【解决方案3】:

    使用itertools.product():

    import itertools
    for x, y, z in itertools.product(range(x_size), range(y_size), range(z_size)):
        pass # do something here
    

    来自文档:

    输入迭代的笛卡尔积。

    相当于生成器表达式中的嵌套 for 循环。
    ...

    【讨论】:

      【解决方案4】:

      这取决于循环内的内容。如果处理列表,您可以使用list comprehension

      对于更一般的情况,请参阅 itertools 上的 this post

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 2019-04-22
        • 2010-12-21
        • 2017-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-30
        相关资源
        最近更新 更多