Python:将两个列表压缩在一起而不截断

时间:2014-01-27 18:01:04

标签: python

我有两个清单:

frame = ["mercury", "noir", "silver", "white" ] 
seat_colors = [ 
            "coconut white", "yello", "black", "green", "cappuccino", 
            "orange", "chrome", "noir", "purple", "pink", "red", 
            "matte", "gray", "bermuda blue" 
                                            ]

我正在尝试将它们组合到一个列表中,其中每个帧都与每个座位颜色唯一匹配。

我想像zip()这样使用:

In [3]: zip(frame, colors)

Out[3]:
[('mercury', 'coconut white'),
 ('noir', 'yello'),
 ('silver', 'black'),
 ('white', 'green')]

但它会截断到最小列表的长度。

我知道我可以通过以下方式遍历列表:

In [5]:

for f in frame:
    for c in colors:
        print "%s, %s" %(f, c)

Out [5]:
mercury, coconut white
mercury, yello
mercury, black
mercury, green
mercury, cappuccino
mercury, orange
mercury, chrome
mercury, noir
mercury, purple
mercury, pink
mercury, red
mercury, matte
mercury, gray
mercury, bermuda blue
noir, coconut white
noir, yello
noir, black
noir, green
....

但是我希望它更聪明,并使用python内置函数的强大功能。

任何想法如何使用zip(或类似zip)并避免截断?

2 个答案:

答案 0 :(得分:10)

使用itertools.izip_longest()保持压缩,直到最长序列用完为止。

这使用默认值(默认为None)代替较短列表的缺失值。

但是,您的输出正在创建两个列表的产品;请使用itertools.product()

from itertools import product

for a_frame, color in product(frame, seat_colors):
    print '{}, {}'.format(a_frame, color)

这两个概念完全不同。 izip_longest()方法会生成len(seat_colors)项,而产品会生成len(seat_colors) * len(frame)项。

答案 1 :(得分:3)

您可以使用itertools.product

import itertools
for item in itertools.product(frame, seat_colors):
    print item

这会产生与嵌套for循环相同的结果。