如何合并两个列表并将它们 return 作为新列表中的元组?
How do you merge two lists and return them as a tuple in a new list?
规则:如果一个列表比另一个短,则较短列表的最后一个元素应根据需要重复出现。如果一个或两个列表为空,则空列表应 returned。
合并([0, 1, 2], [5, 6, 7])
应该return[(0, 5), (1, 6), (2, 7)]
合并([2, 1, 0], [5, 6])
应该return[(2, 5), (1, 6), (0, 6)]
合并([ ], [2, 3])
应该return[]
这就是我到目前为止所写的内容
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]))
您需要手动追加 return 列表中的每个元组,因为您需要相应地检查第二个列表的长度。这是解决这个问题的一种方法
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])
[]
"""
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)]
Link 到 zip_longest
的文档
https://docs.python.org/3/library/itertools.html#itertools.zip_longest
这其实有点棘手。
你会认为像这样简单的东西会起作用:
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
我会使用 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 []
感谢您提问。
我试图修改您的代码,因为它总是更容易理解我们自己的代码。
请查找修改
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))
规则:如果一个列表比另一个短,则较短列表的最后一个元素应根据需要重复出现。如果一个或两个列表为空,则空列表应 returned。
合并([0, 1, 2], [5, 6, 7])
应该return[(0, 5), (1, 6), (2, 7)]
合并([2, 1, 0], [5, 6])
应该return[(2, 5), (1, 6), (0, 6)]
合并([ ], [2, 3])
应该return[]
这就是我到目前为止所写的内容
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]))
您需要手动追加 return 列表中的每个元组,因为您需要相应地检查第二个列表的长度。这是解决这个问题的一种方法
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])
[]
"""
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)]
Link 到 zip_longest
的文档https://docs.python.org/3/library/itertools.html#itertools.zip_longest
这其实有点棘手。 你会认为像这样简单的东西会起作用:
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
我会使用 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 []
感谢您提问。 我试图修改您的代码,因为它总是更容易理解我们自己的代码。 请查找修改
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))