用相同的键合并元组

时间:2018-09-22 07:42:54

标签: python tuples

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

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

并将它们变成

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

4 个答案:

答案 0 :(得分: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())

结果:

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

请注意,转换后的数据最好保留为字典。再次转换为列表将失去词典的“键”功能。

另一方面,如果要保留元组原始列表的“键”的顺序,除非使用的是python 3.6 / 3.7,否则必须创建一个包含原始“键”的列表(有序,唯一),然后从字典中重建列表。或使用OrderedDict,但随后您将无法使用defaultdict(或使用recipe

答案 1 :(得分:4)

您可以使用字典来跟踪每个键的索引,以保持时间复杂度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])]

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

类似于其他答案,您可以使用字典将每个键与值列表相关联。这是在下面的代码片段中的功能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)