使用相同的键合并元组

The*_*r14 12 python tuples

如何使用相同的键合并元组

list_1 = [("AAA", [123]), ("AAA", [456]), ("AAW", [147]), ("AAW", [124])]
Run Code Online (Sandbox Code Playgroud)

并将它们变成

list_2 = [("AAA", [123, 456]), ("AAW", [147, 124])]
Run Code Online (Sandbox Code Playgroud)

Jea*_*bre 15

最高效的方法是使用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())
Run Code Online (Sandbox Code Playgroud)

结果:

[('AAW', [147, 124]), ('AAA', [123, 456])]
Run Code Online (Sandbox Code Playgroud)

请注意,转换后的数据可能最好留作字典.再次转换为列表会丢失字典的"关键"功能.

另一方面,如果你想保留原始元组列表的"键"的顺序,除非你使用python 3.6/3.7,你必须创建一个包含原始"键"的列表(有序) ,unique),然后从字典重建列表.或使用OrderedDict但你不能使用defaultdict(或使用食谱)


blh*_*ing 5

您可以使用 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)
Run Code Online (Sandbox Code Playgroud)

list_2 会成为:

[('AAA', [123, 456]), ('AAW', [147, 124])]
Run Code Online (Sandbox Code Playgroud)


小智 1

您可以创建一个字典并循环遍历该列表。如果字典中存在该项目,则将该值附加到已经存在的列表中,否则将该值分配给键。

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())
Run Code Online (Sandbox Code Playgroud)