You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:57:01