Python 如何删除列表中具有某些重复值(但不是全部)的词典

Python 如何删除列表中具有某些重复值(但不是全部)的词典,python,dictionary,duplicates,Python,Dictionary,Duplicates,例如,假设我得到了以下词典列表: test1 = {'Count':34, 'Letter':'a', 'Word':'all'} test2 = {'Count':890, 'Letter':'a', 'Word':'all'} test3 = {'Count':333, 'Letter':'b', 'Word':'joy'} test4 = {'Count':2, 'Letter':'a', 'Word':'all'} test_list = [test1, test2, test3, t

例如,假设我得到了以下词典列表:

test1 = {'Count':34, 'Letter':'a', 'Word':'all'}
test2 = {'Count':890, 'Letter':'a', 'Word':'all'}
test3 = {'Count':333, 'Letter':'b', 'Word':'joy'}
test4 = {'Count':2, 'Letter':'a', 'Word':'all'}

test_list = [test1, test2, test3, test4]
理想情况下,我想从列表中删除所有包含
'Letter':'a'
'Word':'all'
的词典,但有一个除外,我保留的词典的最大值为
'Count'
。在这种情况下,我希望列表减少为只有
[test2,test3]
。有没有一个简单的方法可以做到这一点

我只能找到在整个字典相同的情况下可以删除重复项的资源,但在只有少量值相同的情况下,我没有找到任何内容。非常感谢您的帮助。

您希望先对词典进行分组,然后只保留每组中
'Count'
值最高的词典。您可以使用集合跟踪已看到的组,以筛选出属于同一组的子序列词典:

grouped = {}
for d in test_list:
    group_key = d['Letter'], d['Word']
    grouped.setdefault(group_key, []).append(d)

test_list = [max(dlist, key=lambda d: d['Count']) for dlist in grouped.values()]
这使您可以在线性时间(O(n))中过滤字典

注意,对于<3.6的Python版本,输出顺序不一定是输入顺序;如果顺序重要,则将
grouped={}
替换为
从集合导入OrderedICT
grouped=OrderedICT()

演示:


您也可以尝试使用以下一行:

test1 = {'Count':34, 'Letter':'a', 'Word':'all'}
test2 = {'Count':890, 'Letter':'a', 'Word':'all'}
test3 = {'Count':333, 'Letter':'b', 'Word':'joy'}
test4 = {'Count':2, 'Letter':'a', 'Word':'all'}
test_list = [test1, test2, test3, test4]
final_list = [i for i in test_list if (i['Word'] != 'all' and i['Letter'] != 'a') or i['Count'] == max([b['Count'] for b in test_list])]
输出:

[{'Count': 890, 'Word': 'all', 'Letter': 'a'}, {'Count': 333, 'Word': 'joy', 'Letter': 'b'}]

如果您有多个
b
joy
条目,该怎么办?您是删除所有分组的多个条目,还是仅删除一个分组?一个问题:您使用的
setdefault
可以替换为
defautdict(list)
correct?@pylang:是的,您也可以使用
defaultdict()
。但是,我发现
defaultdict()
可以更容易地屏蔽错误,因为每当您访问不存在的键时,都会隐式创建值。
[{'Count': 890, 'Word': 'all', 'Letter': 'a'}, {'Count': 333, 'Word': 'joy', 'Letter': 'b'}]