如何统计字典列表重复项并为其添加count键值对?
解决字典列表的重复项统计问题
你的思路方向是对的,但这里有个关键问题:字典是可变对象,直接用item not in summary来判断是否重复会失效,而且原列表里的字典也会被意外修改。另外,原列表中内容相同的字典是不同的对象,所以直接判断成员关系会把它们当成不同项处理。
我们可以换个思路,先用一个普通字典来统计每个唯一字典的出现次数,最后再转换成你想要的格式:
flist = [ {'ext' : '.txt', 'name' : 'file1'}, {'ext' : '.png', 'name' : 'picture1'}, {'ext' : '.txt', 'name' : 'file1'}, {'ext' : '.py', 'name' : 'script'}, ] # 第一步:用不可变的元组作为键,统计次数 count_dict = {} for item in flist: # 把字典转换成(键值对)的元组,因为元组不可变,可以作为字典的键 key = tuple(item.items()) if key in count_dict: count_dict[key] += 1 else: count_dict[key] = 1 # 第二步:转换成目标格式的列表 summary = [] for key, count in count_dict.items(): # 把元组转回字典,再加上count键 item_dict = dict(key) item_dict['count'] = count summary.append(item_dict) # 输出结果 for i in summary: print(i)
运行这段代码后,你会得到期望的输出:
{'ext': '.txt', 'name': 'file1', 'count': 2} {'ext': '.png', 'name': 'picture1', 'count': 1} {'ext': '.py', 'name': 'script', 'count': 1}
如果不想手动处理元组,也可以用frozenset来作为键(不过要注意字典的键值对是无序的,frozenset和tuple都能处理,只要原字典的键顺序不影响唯一性判断)。另外,这种方式不会修改原列表中的字典对象,避免了意外的副作用。
内容的提问来源于stack exchange,提问作者Marzipan
相关产品推荐
相关产品推荐

