簡體   English   中英

如何合並兩個列表並將它們作為新列表中的元組返回?

[英]How do you merge two lists and return them as a tuple in a new list?

規則:如果一個列表比另一個短,則應根據需要經常重復較短列表的最后一個元素。 如果一個或兩個列表為空,則應返回空列表。

合並([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]))

我會使用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))

您需要手動附加返回列表中的每個元組,因為您需要相應地檢查第二個列表的長度。 這是解決這個問題的一種方法

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)]

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM