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

时间:2018-01-19 19:28:04

标签: 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, test4]

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

如果整个字典相同,我只能找到可以删除重复项的资源,但是当只有少量值相同时我没有找到任何东西。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

您首先要分组您的词典,然后只保留每组中'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))过滤字典。

请注意,输出顺序不一定是Python版本的输入顺序< 3.6;如果订单重要,请将grouped = {}替换为from collections import OrderedDictgrouped = OrderedDict()

演示:

>>> 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]
>>> grouped = {}
>>> for d in test_list:
...     group_key = d['Letter'], d['Word']
...     grouped.setdefault(group_key, []).append(d)
...
>>> [max(dlist, key=lambda d: d['Count']) for dlist in grouped.values()]
[{'Count': 890, 'Letter': 'a', 'Word': 'all'}, {'Count': 333, 'Letter': 'b', 'Word': 'joy'}]

答案 1 :(得分:0)

你也可以试试这个单行:

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'}]