Python中所有可能的zip变体

时间:2011-02-05 14:09:09

标签: python list

例如,我的代码如下:

a = [1, 2]
b = [4, 5]

我怎样才能得到这样的东西:

[(1,4), (1,5), (2,4), (2,5)]

与函数zip类似,但具有所有可能的变体。或者不是吗?

4 个答案:

答案 0 :(得分:35)

你想要itertools.product:

>>> import itertools
>>> a = [1,2]
>>> b = [4,5]
>>> list(itertools.product(a,b))
[(1, 4), (1, 5), (2, 4), (2, 5)]

答案 1 :(得分:9)

如果您只对结果感兴趣,那么itertools.product就是您所需要的(@DSM为+1)。但是,如果您对生成此类内容的算法感兴趣,则称其为recursive descent。在这种情况下,算法将按如下方式运行(为了清楚起见,我将在此处打印结果):

def product(L, tmp=None):
    if tmp is None:
        tmp = []
    if L==[]:
        print tmp
    else:
        for i in L[0]:
            product(L[1:], tmp+[i])

因此,

>>> product([[1,2], [4,5]])
[1, 4]
[1, 5]
[2, 4]
[2, 5]

希望这有帮助

答案 2 :(得分:5)

你可以很好地使用列表理解,或者更好地使用生成器表达式,如果你只需要遍历组合。

这是使用列表理解:

a = [1, 2]
b = [4, 5]

[(i, j) for i in a for j in b]

这里有一个生成器表达式:

for pair in ((i, j) for i in a for j in b):
    print(pair)

答案 3 :(得分:4)

不要忽视显而易见的事实:

self, args = args[0], args[1:]  # allow the "self" keyword be passed

或列表推导:

out = []
for a in [1, 2]:
    for b in [4, 5]:
        out.append((a, b))

两者都产生a = [1, 2] b = [4, 5] out = [(x, y) for x in a for y in b]