Обработка словарного столкновения в python3 - PullRequest
0 голосов
/ 14 января 2020

У меня в настоящее время код ниже работает нормально:

Может ли кто-нибудь помочь мне решить коллизию, созданную из-за наличия в словаре двух ключей с одинаковым номером?

Я пробовал несколько подходов (не перечисленные здесь), чтобы попытаться создать массив для обработки, но мои подходы все еще безуспешны.

Я использую # python3 .7

def find_key(dic1, n):
    '''
    Return the key '3' from the dict
    below.
    '''
    d = {}
    for x, y in dic1.items():
        # swap keys and values
        # and update the result to 'd'
        d[y] = x
    try:
        if n in d:
            return d[y]
    except Exception as e:
        return (e)

dic1 = {'james':2,'david':3}
# Case to test that return ‘collision’
# comment 'dic1' above and replace it by
# dic1 below to create a 'collision'
# dic1 = {'james':2,'david':3, 'sandra':3}
n = 3
print(find_key(dic1,n))

Любая помощь будет высоко ценится.

Ответы [ 2 ]

2 голосов
/ 14 января 2020

Вы можете использовать defaultdict:

from collections import defaultdict

def find_key(dct, n):
    dd = defaultdict(list)
    for x, y in dct.items():
        dd[y].append(x)
    return dd[n]

dic1 = {'james':2, 'david':3, 'sandra':3}
print(find_key(dic1, 3))
print(find_key(dic1, 2))
print(find_key(dic1, 1))

Выход:

['david', 'sandra']
['james']
[]

Построение defaultdict из всех ключей и значений оправдано, только если вы будет многократно искать ключи одного и того же набора данных при разных значениях. В противном случае подход Кенни Острома предпочтительнее. В любом случае, вышеприведенное не имеет смысла, если оставить его в том виде, в каком оно есть.

Если вам не очень удобно с генераторами и yield, вот подход Кенни Острома, переведенный в списки (менее эффективный, чем генераторы, лучше, чем выше для поиска в один выстрел):

def find_key(dct, n):
    return [x for x, y in dct.items() if y == n]

Вывод такой же, как и выше.

2 голосов
/ 14 января 2020

Вы знаете, что должно быть несколько возвратов, поэтому планируйте это заранее.

def find_keys_for_value(d, value):
    for k, v in d.items():
        if v == value:
            yield k

data = {'james': 2, 'david': 3, 'sandra':3}
for result in find_keys_for_value(data, 3):
    print (result)
...