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
相关产品推荐
相关产品推荐

