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

2024-05-20 22:03:28 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一本类似{'Alice':'P-1', 12:'F-1', 17:'P-1', 'Bob':'F-1', 19:'T'}的字典。在这种情况下,相同的值表示“P-1”和“F-1”。删除4个条目。我想知道如何编写代码,使之高效,并能处理非常大的字典(如几十个重复值)。你知道吗


Tags: 代码字典情况条目bobalice
2条回答

你可以试试这个:

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

下面是一个函数,它可以满足您的需要:

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

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

相关问题 更多 >