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

Python如何提取字典值中的唯一列表对象?

提取字典中引用唯一的列表对象(避免低效内容比较)

问题场景

我有个算法会在字典的值中生成一组列表,但部分值是同一列表对象的引用,导致实际唯一的列表数量少于字典键的数量。现在需要提取所有剩余的唯一列表对象,同时要避免低效的列表内容比较。我尝试用id()函数实现,但不确定这是否是id()的恰当用法,也想知道有没有更简便的Python实现方式。

示例代码与输出:

# 初始化所有值为独立列表的字典
groups = {i: [i] for i in range(1, 6)}

# 合并部分列表,让部分字典值指向同一列表引用
for a, b in [(1, 2), (2, 4)]:
    groups[a] += groups[b]
    groups[b] = groups[a]

print(groups)

输出:

{1: [1, 2, 4], 2: [1, 2, 4], 3: [3], 4: [1, 2, 4], 5: [5]}

此时字典中键1、2、4的值都是同一个列表[1, 2, 4]的引用。

我目前的实现:

# 提取唯一列表
all_values = list(groups.values())
ids = [id(x) for x in all_values]
result = [all_values[ids.index(a)] for a in set(ids)]

print(result)

输出:

[[1, 2, 4], [3], [5]]

关于id()用法的合理性

用id()来识别同一对象引用是完全恰当的。Python中id()返回对象的唯一整数标识符,在对象的生命周期内,这个值是全局唯一的——同一引用的列表对象id()必然相同,不同的列表对象(哪怕内容完全一样)id()也不同。用它来区分对象引用,比逐元素比较列表内容高效得多(前者是O(1)操作,后者是O(n))。

更高效简便的实现

你当前的实现中,ids.index(a)是O(n)操作,循环下来整体时间复杂度是O(n²),可以优化成O(n)的线性遍历写法:

seen_ids = set()
unique_lists = []
for lst in groups.values():
    lst_id = id(lst)
    if lst_id not in seen_ids:
        seen_ids.add(lst_id)
        unique_lists.append(lst)

print(unique_lists)

输出同样是:

[[1, 2, 4], [3], [5]]

这种写法逻辑更直观,效率也更高,同时保持了利用id()识别唯一对象的核心思路。

补充说明

如果你的场景中,可能存在内容完全相同但是不同对象的列表,而你希望把这类列表也视为“重复”,那才需要用到列表内容比较。但根据你的问题描述,你要区分的是同一对象引用的列表,所以用id()是最优解。

内容的提问来源于stack exchange,提问作者Bill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 15:46:29