我有两个清单:
a = ['1', '2']
b = ['11', '22', '33', '44']
我要将它们组合起来创建一个如下所示的列表:
op = [('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
我怎么能实现这个目标?
答案 0 :(得分:9)
您希望itertools.zip_longest的空字符串为fillvalue
:
a = ['1', '2']
b = ['11', '22', '33', '44']
from itertools import zip_longest # izip_longest for python2
print(list(zip_longest(a,b, fillvalue="")))
[('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
对于python2,它是 izip_longest :
from itertools import izip_longest
print(list(izip_longest(a,b, fillvalue="")))
[('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
如果您只想使用这些值,可以迭代izip对象:
for i,j in izip_longest(a,b, fillvalue=""):
# do whatever
一些时间与使用地图:
In [51]: a = a * 10000
In [52]: b = b * 9000
In [53]: timeit list(izip_longest(a,b,fillvalue=""))
100 loops, best of 3: 1.91 ms per loop
In [54]: timeit [('', i[1]) if i[0] == None else i for i in map(None, a, b)]
100 loops, best of 3: 6.98 ms per loop
map
还使用python2创建另一个列表,因此对于大型列表或者如果您有内存限制,最好避免使用。
答案 1 :(得分:-1)
在Python 2.7中:另一种方法:
[('', i[1]) if i[0] == None else i for i in map(None, a, b)]
对于问题中给出的示例列表,这种方式比使用izip_longest更快:
>>> timeit.timeit("[('', i[1]) if i[0] == None else i for i in map(None, a, b)]", 'from __main__ import a, b')
1.3226220607757568
>>> timeit.timeit("list(itertools.izip_longest(a, b, fillvalue=''))", 'from __main__ import a, b')
1.629504919052124
如果列表较长且用''
填充不存在的值,则izip_longest
明显更快。
但是,如果您对使用None
而不是''
创建结果列表感到满意,则不需要列表理解或条件:只需{{1 }}。然后,对于更长的列表,速度可以类似于map(None, a, b)
的速度。
请注意,当要组合不等长度的列表时,结果不一定是较长的列表的长度。如果你想要一个zip类型的函数总是取第一个参数的长度,那么SO问题的答案就是#34; Is there a middle ground between `zip` and `zip_longest`"很有启发性。