如何移除defaultdict中列表内的重复字典元素?
移除defaultdict列表中的重复字典元素
问题场景
我使用collections.defaultdict创建了如下对象:
from collections import defaultdict original_dict = defaultdict(list, {'192.168.20.10/32': [{1: 'aaaaa11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}], '192.168.20.20/32': [{1: 'aaaaa11111\n'}, {2: 'aaaaa11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}]})
需要遍历该对象,移除每个列表中的重复字典元素,最终预期结果为:
defaultdict(list, {'192.168.20.10/32': [{1: 'aaaaa11111\n'}, {2: 'bbbbb11111\n'}], '192.168.20.20/32': [{1: 'aaaaa11111\n'}, {2: 'bbbbb11111\n'}]})
解决方案
由于字典是不可哈希类型,无法直接用集合去重,我们可以将字典转换为可哈希的排序元组,去重后再转回字典。代码实现如下:
from collections import defaultdict original_dict = defaultdict(list, {'192.168.20.10/32': [{1: 'aaaaa11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}], '192.168.20.20/32': [{1: 'aaaaa11111\n'}, {2: 'aaaaa11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}, {2: 'bbbbb11111\n'}]}) # 遍历每个IP对应的列表进行去重 for ip in original_dict: # 将字典转为排序后的键值对元组,利用集合去重 unique_items = set(tuple(sorted(d.items())) for d in original_dict[ip]) # 将元组转回字典,替换原列表 original_dict[ip] = [dict(item) for item in unique_items] # 输出结果 print(original_dict)
说明
- 把字典转成排序后的键值对元组,是为了确保内容完全相同的字典(即使键的顺序不同,通用场景下)能被转换为相同的元组,保证去重的准确性。
- 集合会自动剔除重复的元组,最后再把元组转回字典,即可得到去重后的列表。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

