使用集合推导式提取字典唯一对象时遇'int'不可迭代错误
获取字典列表中唯一对象的集合推导式方案
你遇到的错误原因很明确:hash(s.values())会返回一个整数(整个字典值视图的哈希值),而整数是不可迭代的,所以在集合推导式里遍历它就会抛出TypeError: 'int' object is not iterable。
要解决这个问题,我们需要两步:
- 正确遍历字典中所有的对象列表和内部对象
- 处理字典不可哈希的问题(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
相关产品推荐
相关产品推荐

