規則:如果一個串列比另一個短,則應根據需要經常重復較短串列的最后一個元素。如果一個或兩個串列為空,則應回傳空串列。
合并([0, 1, 2], [5, 6, 7])
應該回傳 [(0, 5), (1, 6), (2, 7)]
合并([2, 1, 0], [5, 6])
應該回傳 [(2, 5), (1, 6), (0, 6)]
合并([ ], [2, 3])
應該回傳 []
這是我到目前為止所寫的
def merge(a, b):
mergelist = []
for pair in zip(a, b):
for item in pair :
mergelist.append(item )
return mergelist
列印(合并([0、1、2]、[5、6]))
uj5u.com熱心網友回復:
我會用zip_longest:
from itertools import zip_longest
def merge(a, b):
return list(a and b and zip_longest(a, b, fillvalue=min(a, b, key=len)[-1]))
同樣的事情,不同的風格:
def merge(a, b):
if a and b:
short = min(a, b, key=len)
return list(zip_longest(a, b, fillvalue=short[-1]))
return []
uj5u.com熱心網友回復:
您需要手動附加回傳串列中的每個元組,因為您需要相應地檢查第二個串列的長度。這是解決這個問題的一種方法
def merge(l1, l2):
new = []
for i in range(len(l1)):
if i > len(l2)-1:
s2 = l2[len(l2)-1] # use the last element of second list if there are no more elements
else:
s2 = l2[i]
new.append(l1[i], s2)
return new
"""
>>> merge([0,1,2],[5,6,7])
[(0, 5), (1, 6), (2, 7)]
>>> merge([2,1,0],[5,6])
[(2, 5), (1, 6), (0, 6)]
>>> merge([],[2,3])
[]
"""
uj5u.com熱心網友回復:
感謝您提出問題。我試圖修改你的代碼,因為它總是更容易理解我們自己的代碼。請查找修改
def merge(a, b):
mergelist = []
if not a or not b:
return []
elif len(a) > len(b):
occ = len(a)-len(b)
b.extend([b[len(b)-1] for i in range(occ)])
elif len(a) < len(b):
occ = len(b)-len(a)
a.extend([a[len(a)-1] for i in range(occ)])
for pair in zip(a, b):
mergelist.append(pair)
return mergelist
print(merge(l,l1))
uj5u.com熱心網友回復:
這實際上有些棘手。你會認為像這樣簡單的事情會起作用:
def merge(a, b):
# use iterator to keep iterations state after zip
a, b = iter(a), iter(b)
rtrn = list(zip(a, b))
try:
taila, tailb = rtrn[-1]
except IndexError: # one or both empty
return rtrn
# only one of these loops will run, draining the longer input list
rtrn.extend((ai, tailb) for ai in a)
rtrn.extend((taila, bi) for bi in b)
return rtrn
這里的技巧是使用迭代器,而不是可迭代的。迭代器保持其狀態。所以在 zip 之后,兩個迭代器仍然應該指向 zip 停止的地方。但是,如果 b 是較短的串列,則這不起作用。因為這樣 zip 將從 a 中洗掉一個值并將其丟棄。你必須小心避免這種情況。最簡單的方法是將兩個串列具體化并明確處理長度差異。
def merge(a, b):
# ensure that we have lists, not anything else like iterators, sets, etc
a, b = list(a), list(b)
rtrn = list(zip(a, b))
try:
taila, tailb = rtrn[-1]
except IndexError: # one or both empty
return rtrn
rtrnlen = len(rtrn)
# only one of these loops will run, draining the longer input list
# You could also use itertools.zip_longest for this
rtrn.extend((ai, tailb) for ai in a[rtrnlen:])
rtrn.extend((taila, bi) for bi in b[rtrnlen:])
return rtrn
uj5u.com熱心網友回復:
from itertools import zip_longest
def merge(a,b):
if len(a) > len(b):
return list((zip_longest(a,b,fillvalue=b[-1])))
else:
return list((zip_longest(a,b,fillvalue=a[-1])))`
例如
a = [2,3,5]
b = [1,2]
merge(a,b)
[(2, 1), (3, 2), (5, 2)]
zip_longest 檔案的鏈接
https://docs.python.org/3/library/itertools.html#itertools.zip_longest
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/342472.html
