【问题标题】:Automatically nested for loops in python在python中自动嵌套for循环
【发布时间】:2011-01-23 21:51:59
【问题描述】:

我知道可以使用同时访问两个集合

for i,j in zip([1,2,3],[4,5,6]):
    print i,j

1 4
2 5
3 6

我想做的是这样的:

for i,j in [[1,2,3],[4,5,6]]:
    print i,j

1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6

我希望 python 自动为我创建嵌套的 for 循环。当列表维度达到 5 或 6 时,我想避免在我的代码中使用许多嵌套的 for 循环。这可能吗?

【问题讨论】:

  • @delnan (4) == Sven 的回复,这正是我想要的。

标签: python for-loop nested-loops


【解决方案1】:

试试

for i, j in itertools.product([1, 2, 3], [4, 5, 6]):
    print i, j

【讨论】:

  • 看了一下文档,我需要升级到 python 2.6。似乎完全按照我的意愿去做。将在 8 分钟内检查。谢谢。
  • @puddingfox:你也可以从documentation复制实现,但是效率会比Real Thing低。
  • Itertools 摇滚。值得花时间学习该工具箱中的工具。
【解决方案2】:
>>> [[x,y] for x in [1,2,3] for y in [4,5,6]]
[[1, 4], [1, 5], [1, 6], [2, 4], [2, 5], [2, 6], [3, 4], [3, 5], [3, 6]]

从结果列表中得到你想要的应该很容易。

【讨论】:

  • 但这对于嵌套 n 次的列表更难概括。
  • 是吗?也许我不太明白,但如果你只是做[[x,y,z] for x in [1,2,3] for y in [4,5,6] for z in [7,8,9]] 它应该可以扩展,不是吗?
  • 好吧,与使用产品相比,它确实看起来有点笨拙。但是最大的区别在于嵌套 LC 具有硬编码的尺寸 - 而产品可以使用任意数量的尺寸
  • @gnibbler:啊,明白了。谢谢。
【解决方案3】:

我遇到过一些需要迭代的逻辑相当复杂的情况——所以你总是可以把它分解成它自己的生成器:

def it():
    i = 0
    for r in xrange(rows):
        for c in xrange(cols):
            if i >= len(images):
                return
            yield r, c, images[i], contents[i]
            i += 1

for r, c, image, content in it():
    # do something...

但通常我发现将简单的嵌套循环拼写出来比将您正在循环的内容混淆为对其他代码的调用要好。如果嵌套的循环超过 2-3 个,则代码可能无论如何都需要重构。

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 2012-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 2017-06-05
    • 2015-01-28
    • 2018-08-12
    相关资源
    最近更新 更多