例如,假设我已经给出了这个词典列表:
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]
。有一种简单的方法可以做到这一点吗?
如果整个字典相同,我只能找到可以删除重复项的资源,但是当只有少量值相同时我没有找到任何东西。任何帮助表示赞赏。
答案 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 OrderedDict
和grouped = 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'}]