如何对Python字典列表分组以获取各元素对应的索引列表
实现字典列表去重并匹配对应索引列表的方法
你用itertools.groupby失败的核心原因:groupby只会将连续出现的相同元素归为同一组,你示例里的两个{'b':30}并不相邻,会被识别为两个独立分组,自然无法得到预期结果。
推荐方案:单次遍历+临时字典映射
这种方法只需要遍历一次原列表,时间复杂度O(n),还能保留元素第一次出现的顺序(Python3.7+原生支持字典插入顺序保留),是性价比最高的实现方式:
l = [{'a':25}, {'a':25}, {'b':30}, {'c':200}, {'b':30}] temp = {} for idx, item in enumerate(l): # 将字典转为可哈希的frozenset作为映射的key hash_key = frozenset(item.items()) if hash_key not in temp: temp[hash_key] = (item, [idx]) else: temp[hash_key][1].append(idx) # 提取结果 result = list(temp.values()) print(result)
运行输出和你要求的格式完全一致:
[({'a': 25}, [0, 1]), ({'b': 30}, [2, 4]), ({'c': 200}, [3])]
可选方案:排序后使用groupby
如果你一定要用groupby实现也可以,但需要先对原列表按字典的哈希key排序,让相同元素连续排列,缺点是会丢失元素首次出现的原有顺序,实现如下:
from itertools import groupby l = [{'a':25}, {'a':25}, {'b':30}, {'c':200}, {'b':30}] # 先对带索引的元素按哈希key排序,让相同元素连续 sorted_items = sorted(enumerate(l), key=lambda x: frozenset(x[1].items())) result = [] for key, group in groupby(sorted_items, key=lambda x: frozenset(x[1].items())): group_data = list(group) # 取分组内第一个元素的原字典,收集所有对应索引 result.append((group_data[0][1], [item[0] for item in group_data])) print(result)
内容的提问来源于stack exchange,提问作者Ezer K
相关产品推荐
相关产品推荐

