我需要通过重复按键将项目放在“组”中。意思是,只要它们具有相同的密钥,就将它们放在一组中。如果下一个项目具有不同的键,则创建新组并将项目值放入其中。然后,只要后续项具有相同的密钥,就使用同一组。
例如具有此列表(其中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
但是我想知道是否可以使用一些更优雅(更简单)的方法?
答案 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])]