python: 单行笛卡尔积 for 循环

4 投票
2 回答
7466 浏览
提问于 2025-04-16 16:15

你知道你可以这样做吗?

>>> [(x,y) for x in xrange(2) for y in xrange(5)]
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (1, 0), (1, 1), (1, 2), (1, 3), (1, 4)]

这很酷。有没有类似的写法可以用在for循环上,还是说只能在列表推导式中使用?

编辑:我觉得我的问题被误解了。我想知道有没有特别的语法可以用来做这个:

for x in xrange(2) <AND> y in xrange(5):
    print "do stuff here"
    print "which doesn't fit into a list comprehension"
    print "like printing x and y cause print is a statement", x, y

我可以这样做,但感觉有点重复:

for x,y in ((x,y) for x in xrange(2) for y in xrange(5)):
    print x, y

2 个回答

5

这是一种等效的、更简洁的写法:

def values():
    for x in xrange(2):
        for y in xrange(5):
            yield (x, y)
list(values())

更新:要比较这两者的字节码,可以这样做:

import dis
print dis.dis(values)   # above function

gen = ((x,y) for x in xrange(2) for y in xrange(5))
print dis.dis(gen.gi_code)
10

其实你想要的这个语法是没有的,不过有一个叫做 itertools.product 的东西可以用。

>>> import itertools
>>> for x, y in itertools.product([1,2,3,4], [5,6,7,8]): print x, y
... 
1 5
1 6
1 7
1 8
[ ... and so on ... ]

撰写回答