如何删除具有相同值的字典中的所有条目并获取删除的条目数?

时间:2017-12-18 21:25:00

标签: python python-3.x

说我有一个像ApplicationRef这样的词典。在这种情况下,相同的值将表示“P-1”和“F-1”。并删除了4个条目。我想知道如何编写我的代码以使其有效并且可以处理非常大的字典(例如几十个重复的值)。

2 个答案:

答案 0 :(得分:1)

这是一个可以做你想要的功能:

>>> import collections
>>> def remove_duplicates(d):
...     grouper = collections.defaultdict(list)
...     for k, v in d.items():
...         grouper[v].append(k)
...     total = 0
...     for val, keys in grouper.items():
...         if len(keys) > 1:
...             for k in keys:
...                 del d[k]
...             total += len(keys)
...     return total
...
>>> d = {'Alice':'P-1', 12:'F-1', 17:'P-1', 'Bob':'F-1', 19:'T'}
>>> remove_duplicates(d)
4
>>> d
{19: 'T'}

它在线性时间内工作,但需要线性空间。就个人而言,我会创建一个新词典,而不是修改原文,但这就是上面所做的。

答案 1 :(得分:0)

你可以试试这个:

import re
s = {'Alice':'P-1', 12:'F-1', 17:'P-1', 'Bob':'F-1', 19:'T'}
removal_count = len([b for a, b in s.items() if b[-1].isdigit() and [re.findall('\d+$', c) for c in s.values()].count(re.findall('\d+$', b)) > 1])
print(removal_count)

输出:

4

过滤字典:

new_s = {a:b for a, b in s.items() if [re.findall('\d+$', c) for c in s.values()].count(re.findall('\d+$', b)) <= 1}

输出:

{19: 'T'}