keyerror 1 в моем коде



Я пишу функцию, которая принимает ввод словаря и возвращает список ключей, имеющих уникальные значения в этом словаре. Рассмотрим,



ip = {1: 1, 2: 1, 3: 3}


Поэтому вывод должен быть [3], так как ключ 3 имеет уникальное значение, которого нет в dict.



Теперь есть проблема в данной функции:



def uniqueValues(aDict):

dicta = aDict
dum = 0
for key in aDict.keys():

for key1 in aDict.keys():

if key == key1:
dum = 0
else:
if aDict[key] == aDict[key1]:
if key in dicta:
dicta.pop(key)
if key1 in dicta:
dicta.pop(key1)

listop = dicta.keys()
print listop
return listop


Я получаю ошибку, как:




Файл "main.py", строка 14, в уникальных значениях
if aDict [key] == aDict[key1]: KeyError: 1




Где я делаю неправильно?

446   2  

2 ответов:

Ваша главная проблема заключается в следующем:

dicta = aDict

Вы думаете, что делаете копию словаря, но на самом деле у вас все еще есть только один словарь, поэтому операции с dicta также изменяют aDict (и поэтому вы удаляете значения из adict, они также удаляются из aDict, и поэтому вы получаете свой KeyError).

Одним из решений будет

dicta = aDict.copy()

(вы также должны дать своим переменным более четкие имена, чтобы сделать более очевидным для себя, что вы делаете)

(edit) также, более простой способ делать то, что вы делаете:

def iter_unique_keys(d):
    values = list(d.values())
    for key, value in d.iteritems():
        if values.count(value) == 1:
            yield key

print list(iter_unique_keys({1: 1, 2: 1, 3: 3}))

Использование Counter из библиотеки collections:

from collections import Counter

ip = {
    1: 1,
    2: 1,
    3: 3,
    4: 5,
    5: 1,
    6: 1,
    7: 9
}

# Generate a dict with the amount of occurrences of each value in 'ip' dict
count = Counter([x for x in ip.values()])

# For each item (key,value) in ip dict, we check if the amount of occurrences of its value.
# We add it to the 'results' list only if the amount of occurrences equals to 1. 
results = [x for x,y in ip.items() if count[y] == 1]

# Finally, print the results list
print results

Вывод:

[3, 4, 7]

Comments

    Ничего не найдено.