web-dev-qa-db-fra.com

keyerror 1 dans mon code

J'écris une fonction qui prend une entrée de dictionnaire et retourne une liste de clés qui ont des valeurs uniques dans ce dictionnaire. Considérer, 

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

la sortie devrait donc être [3] car la clé 3 a une valeur unique qui n'est pas présente dans dict.

Maintenant, il y a un problème dans la fonction donnée:

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

Je reçois une erreur comme:

Fichier "main.py", ligne 14, dans uniqueValues ​​ Si aDict [clé] == aDict [clé1]: KeyError: 1

Où je me trompe?

5
rajesh padgilwar

Votre problème principal est cette ligne:

dicta = aDict

Vous pensez que vous faites une copie du dictionnaire, mais vous n’avez en réalité qu’un dictionnaire. Les opérations sur les dicta changent également aDict (et donc, vous supprimez des valeurs d’adict, elles sont également supprimées de aDict et vous obtenez ainsi votre valeur. KeyError).

Une solution serait 

dicta = aDict.copy()

(Vous devez également donner à vos variables des noms plus clairs pour que vous sachiez mieux ce que vous faites.)

(edit) En outre, un moyen plus simple de faire ce que vous faites:

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}))
2
Emile

UtilisezCounterfrom collections library:

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

Sortie:

[3, 4, 7]