查找具有重复值的字典键

问题描述 投票:0回答:7
some_dict = {"firstname": "Albert", "nickname": "Albert", "surname": "Likins", "username": "Angel"}

我想返回我的字典的键,其中它们的值存在不止一次。

有人可以告诉我如何实现这一点吗?

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)
python dictionary
7个回答
38
投票

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

>>> 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)

现在,您只需在多重字典中查找值大于 1 的键。这很简单:

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

除了多字典键是原始字典值。因此,这是每个重复值,而不是与每个重复值匹配的所有键。但你知道匹配每个重复值的所有键是什么吗?

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

19
投票
我将从翻转键和值开始:

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

7
投票
此方法既不需要外部库,也不需要

if

 语句:

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

reverse_dic[v] = reverse_dic.get(v, []) + [k]

 替换了 4 行 if-else 代码


3
投票
如果你的数据集不是太大,你不需要反向多重字典。您可以在 dict.values() 上使用 count 并通过迭代 dict.items() 返回所需的键。

desired_keys = [] vals = some_dict.values() for key, value in some_dict.items(): if vals.count(value) > 1: desired_keys.append(key)

希望这有帮助!


3
投票
使用“defaultdict”:

from collections import defaultdict s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)] d = defaultdict(list) for k, v in s: d[k].append(v) for key, value in d.items(): if len(value) > 1: print "key: %s has multiple values: %r" % (key, value)
    

2
投票
此方法使用

try

for

原始数据

original_dict = {"firstname":"Albert", "nickname":"Albert", "surname":"Likins", "username":"Angel"}
代码

reverse_dict = {} for key, value in original_dict.items(): try:reverse_dict[value].append(key) except:reverse_dict[value] = [key]
此方法使用

dict.get()

reverse_dict = {} for k, v in original_dict.items(): reverse_dict[v] = reverse_dict.get(v, []) + [k]
结果

>>> reverse_dict {'Albert': ['firstname', 'nickname'], 'Likins': ['surname'], 'Angel': ['username']} >>> [value for key, value in reverse_dict.items() if len(value) > 1] [['firstname', 'nickname']]
    

0
投票
一个衬垫:

from collections import Counter [k for k, v in some_dict.items() if v in {v for v, count in Counter(some_dict.values()).items() if count > 1}]
    
© www.soinside.com 2019 - 2024. All rights reserved.