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?
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}))
UtilisezCounter
from 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]