将两个列表组合到一个列表列表中

时间:2015-04-24 17:10:30

标签: python list

我有两个清单:

a = ['1', '2']
b = ['11', '22', '33', '44']

我要将它们组合起来创建一个如下所示的列表:

op = [('1', '11'), ('2', '22'), ('', '33'), ('', '44')]

我怎么能实现这个目标?

2 个答案:

答案 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`"很有启发性。