Python:按重复键分组

时间:2019-07-17 11:16:19

标签: python grouping

我需要通过重复按键将项目放在“组”中。意思是,只要它们具有相同的密钥,就将它们放在一组中。如果下一个项目具有不同的键,则创建新组并将项目值放入其中。然后,只要后续项具有相同的密钥,就使用同一组。

例如具有此列表(其中0索引是键,而1则是值):

lst = [('a', 10), ('b', 20), ('b', 20), ('a', 30), ('a', 40)]

分组后,应输出:

[('a', [10]), ('b', [20, 20]), ('a', [30, 40])]

当前我正在使用此解决方案:

def group_by_repeating_key(lst):
    # Init group.
    groups = [(lst[0][0], [lst[0][1]])]
    for item in lst[1:]:
        last_group = groups[-1]
        group_key = last_group[0]
        item_key = item[0]
        item_value = item[1]
        if group_key == item_key:
            last_group[1].append(item_value)
        else:
            groups.append((item_key, [item_value]))
    return groups

但是我想知道是否可以使用一些更优雅(更简单)的方法?

2 个答案:

答案 0 :(得分:4)

使用itertools.groupby

例如:

from itertools import groupby

lst = [('a', 10), ('b', 20), ('b', 20), ('a', 30), ('a', 40)]
result = [(k, [i for _, i in v]) for k, v in groupby(lst, lambda x: x[0])]
print(result)   

输出:

[('a', [10]), ('b', [20, 20]), ('a', [30, 40])]

答案 1 :(得分:0)

以下简单算法起作用:

lst = [('a', 10), ('b', 20), ('b', 20), ('a', 30), ('a', 40)]
outlist = []

for item in lst: 
    if len(outlist)>0 and outlist[-1][0]==item[0]:
        outlist[-1][1].append(item[1]); 
    else: 
        outlist.append((item[0], [item[1]]))

print(outlist)

输出:

[('a', [10]), ('b', [20, 20]), ('a', [30, 40])]