查找具有重复值的字典键

时间:2013-12-19 02:10:40

标签: python dictionary

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)

6 个答案:

答案 0 :(得分:20)

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

>>> 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个值的multidict中的键。这很简单:

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

答案 1 :(得分:15)

我首先要翻转键和值:

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

如果您的数据集不是太大,则不需要反向多指令。你可以在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)

希望这有帮助!

答案 4 :(得分:1)

此方法使用'尝试' ' 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]

结果

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

>>> [value for key, value in reverse_dict.items() if len(value) > 1]
[['firstname', 'nickname']]

答案 5 :(得分:1)

使用" 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)