的名單上有兩個列表:合併兩個列表成爲名單
a = ['1', '2']
b = ['11', '22', '33', '44']
我結合他們創造類似下面的列表:
op = [('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
我怎麼能做到這一點?
的名單上有兩個列表:合併兩個列表成爲名單
a = ['1', '2']
b = ['11', '22', '33', '44']
我結合他們創造類似下面的列表:
op = [('1', '11'), ('2', '22'), ('', '33'), ('', '44')]
我怎麼能做到這一點?
你想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
個
一些計時VS使用地圖:
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因此對於大名單,或者如果你擁有它,最好避免內存限制的另一個列表。
在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
而不是''
創建結果列表,則不需要列表理解或條件:只需map(None, a, b)
。然後,對於較長的列表,速度可以類似於izip_ilongest
。
請注意,當要組合不等長的列表時,結果不一定是長度較長的結果。如果你想要一個zip類型的函數總是取第一個參數的長度,那麼對SO問題「Is there a middle ground between `zip` and `zip_longest`」的回答就會變得很明顯。
它說不能導入名稱zip_longest – sam
'izip_longest for python2' –
我正在使用python 2.7 – sam