查找具有重复值的字典键

2024-05-19 09:35:02 发布

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

some_dict = {"firstname": "Albert", "nickname": "Albert", "surname": "Likins", "username": "Angel"}

我想返回我的dict的键,它们的值存在不止一次。

有人能告诉我怎么实现吗?

a_list = []
for k,v in  some_dict.iteritems():
    if v in some_dict.values() and v != some_dict.keys(k):
        a_list.append(k)

Tags: inforifnicknameusernamesomesurnamefirstname
3条回答

我会先翻动键和值:

flipped = {}

for key, value in d.items():
    if value not in flipped:
        flipped[value] = [key]
    else:
        flipped[value].append(key)

使用collections.defaultdict(set)可以更有效地执行此操作。对于您的字典,flipped看起来像:

{
    'Albert': ['nickname', 'firstname'],
    'Angel':  ['username'],
    'Likins': ['surname']
}

此方法不需要外部库或if语句:

    reverse_dic = {}
    for k, v in original_dic.iteritems():
        reverse_dic[v] = reverse_dic.get(v, [])
        reverse_dic[v].append(k)

首先,将字典翻转成一个反向multidict,将每个值映射到它映射到的所有键。像这样:

>>> some_dict = {"firstname":"Albert","nickname":"Albert","surname":"Likins","username":"Angel"}
>>> rev_multidict = {}
>>> for key, value in some_dict.items():
...     rev_multidict.setdefault(value, set()).add(key)

现在,您只需在multidict中查找值大于1的键。很简单:

>>> [key for key, values in rev_multidict.items() if len(values) > 1]
['Albert']

除了multidict键是原始dict值。所以,这是每个重复值,不是所有匹配每个重复值的键。但是你知道什么是匹配每个重复值的键吗?

>>> [values for key, values in rev_multidict.items() if len(values) > 1]
[{'firstname', 'nickname'}]

当然,这会给你一个集合列表。如果你想把它平展成一个列表或集合,那很简单。您可以使用chain.from_iterable、嵌套理解或任何其他常用技巧。例如:

>>> set(chain.from_iterable(values for key, values in rev_multidict.items() if len(values) > 1))
{'firstname', 'nickname'}

相关问题 更多 >

    热门问题