簡體   English   中英

使用相同的鍵合並元組

[英]Merge tuples with the same key

如何使用相同的鍵合並元組

list_1 = [("AAA", [123]), ("AAA", [456]), ("AAW", [147]), ("AAW", [124])]

並將它們變成

list_2 = [("AAA", [123, 456]), ("AAW", [147, 124])]

最高效的方法是使用collections.defaultdict字典將數據存儲為擴展列表,然后根據需要轉換回元組/列表:

import collections

list_1 = [("AAA", [123]), ("AAA", [456]), ("AAW", [147]), ("AAW", [124])]

c = collections.defaultdict(list)
for a,b in list_1:
    c[a].extend(b)  # add to existing list or create a new one

list_2 = list(c.items())

結果:

[('AAW', [147, 124]), ('AAA', [123, 456])]

請注意,轉換后的數據可能最好留作字典。 再次轉換為列表會丟失字典的“關鍵”功能。

另一方面,如果你想保留原始元組列表的“鍵”的順序,除非你使用python 3.6 / 3.7,你必須創建一個包含原始“鍵”的列表(有序) ,unique),然后從字典重建列表。 或使用OrderedDict然后你不能使用defaultdict (或使用食譜

您可以使用dict來跟蹤每個鍵的索引以保持時間復雜度O(n):

list_1 = [("AAA", [123]), ("AAA", [456]), ("AAW", [147]), ("AAW", [124])]
list_2 = []
i = {}
for k, s in list_1:
    if k not in i:
        list_2.append((k, s))
        i[k] = len(i)
    else:
        list_2[i[k]][1].extend(s)

list_2將成為:

[('AAA', [123, 456]), ('AAW', [147, 124])]

您可以創建字典並循環遍歷列表。 如果字典中的項目將值附加到現有列表,則將值分配給鍵。

dict_1 = {}
for item in list_1:
    if item[0] in dict_1:
        dict_1[item[0]].append(item[1][0])
    else:
        dict_1[item[0]] = item[1]
list_2 = list(dict_1.items())

與其他答案類似,您可以使用字典將每個鍵與值列表相關聯。 這是在下面的代碼片段中的函數merge_by_keys中實現的。

import pprint

list_1 = [("AAA", [123]), ("AAA", [456]), ("AAW", [147]), ("AAW", [124])]

def merge_by_key(ts):

    d = {}
    for t in ts:
        key = t[0]
        values = t[1]
        if key not in d:
            d[key] = values[:]
        else:
            d[key].extend(values)

    return d.items()



result = merge_by_key(list_1)

pprint.pprint(result)

暫無
暫無

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

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