Найти словарные ключи с повторяющимися значениями

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)

Ответ 1

Сначала переверните словарь вокруг в обратное многоточечное, сопоставляя каждое значение со всеми ключами, к которым он привязан. Вот так:

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

Теперь вы просто ищете ключи в мультидикции, которые имеют более одного значения. Это легко:

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

За исключением многоточечных ключей исходные значения 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'}

Ответ 2

Я бы начал с переворота ключей и значений:

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

Ответ 3

Этот метод не требует ни внешних библиотек, ни оператора if:

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

Ответ 4

Если ваш набор данных не слишком велик, вам не нужна обратная множественность. Вы можете использовать count on dict.values ​​() и вернуть нужные ключи, итерации по dict.items().

desired_keys = []

vals = some_dict.values()

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

Надеюсь, это поможет!

Ответ 5

Этот метод использует "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]

результат

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

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

Ответ 6

Использование параметра 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)