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

sam*_*sam 4 python list

我有两个清单:

a = ['1', '2']
b = ['11', '22', '33', '44']
Run Code Online (Sandbox Code Playgroud)

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

op = [('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
Run Code Online (Sandbox Code Playgroud)

我怎么能实现这个目标?

Pad*_*ham 9

你想itertools.zip_longestfillvalue一个空字符串:

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')]
Run Code Online (Sandbox Code Playgroud)

对于python2,它是izip_longest:

from itertools import izip_longest 

print(list(izip_longest(a,b, fillvalue="")))
[('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
Run Code Online (Sandbox Code Playgroud)

如果您只想使用这些值,可以迭代izip对象:

for i,j  in izip_longest(a,b, fillvalue=""):
   # do whatever
Run Code Online (Sandbox Code Playgroud)

一些时间与使用地图:

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
Run Code Online (Sandbox Code Playgroud)

map 还使用python2创建另一个列表,因此对于大型列表或者如果您有内存限制,最好避免使用.