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

使用集合推导式提取字典唯一对象时遇'int'不可迭代错误

获取字典列表中唯一对象的集合推导式方案

你遇到的错误原因很明确:hash(s.values())会返回一个整数(整个字典值视图的哈希值),而整数是不可迭代的,所以在集合推导式里遍历它就会抛出TypeError: 'int' object is not iterable。

要解决这个问题,我们需要两步:

  1. 正确遍历字典中所有的对象列表和内部对象
  2. 处理字典不可哈希的问题(Python的dict对象不能直接放入集合,因为集合要求元素是可哈希类型)

方案1:基于对象内容去重(保留字典结构)

我们可以把每个字典对象转换成可哈希的元组(比如排序后的键值对元组,确保相同内容的字典得到相同的元组),用集合去重后再转回字典:

s = { 
    "item1":[ 
        { "id":"integration_test_a", "version":"2020-09-18t17:00:04" }, 
        { "id":"integration_test_b", "version":"2020-09-24t05:58:38" }, 
        { "id":"integration_test_a", "version":"2020-09-24t06:01:06" } 
    ], 
    "item2":[ 
        { "id":"integration_test_a", "version":"2020-09-18t17:00:04" }, 
        { "id":"integration_test_a", "version":"2020-09-24t06:04:30" }, 
        { "id":"integration_test_c", "version":"2020-09-24t09:35:26" } 
    ] 
}

# 先转成可哈希的元组去重
unique_tuples = {tuple(sorted(obj.items())) for item_list in s.values() for obj in item_list}
# 转回字典集合
unique_objects = set(dict(t) for t in unique_tuples)

方案2:基于唯一标识去重(更高效)

如果你的对象的唯一标识是id和version的组合,可以直接用这两个字段组成的元组作为哈希键,同时用字典暂存对象(避免重复),最后取字典的值作为唯一对象集合:

# 用字典暂存,键是唯一标识元组,值是对应的对象
temp_map = {(obj['id'], obj['version']): obj 
            for item_list in s.values() 
            for obj in item_list}
# 从字典值中得到唯一对象集合
unique_objects = set(temp_map.values())

关键解释

  • 遍历逻辑:for item_list in s.values() for obj in item_list 是集合推导式的嵌套遍历,先拿到字典中每个值对应的列表,再遍历列表里的每个对象。
  • 可哈希转换:因为字典本身不可哈希,所以必须转换成元组这类可哈希类型才能放入集合;方案2用字典暂存的方式更直观,也能直接保留原字典对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 18:47:55