Mon entrée est:
dictresult= {}
for key,value in files.items():
dictresult[key]=value
dictresult[value].append(key)
Je veux la sortie comme:
{'Randy':['Input.txt','Output.txt'], 'Stan':['Code.py']}
Fondamentalement, c'est l'autre direction de ceci basculer la clé et les valeurs dans un dictionnaire de listes
Voici ce que j'ai essayé:
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
Mais ça ne marche pas. J'obtiens KeyError: 'Randy'
6 Réponses :
Essayez d'utiliser defaultdict -
from collections import defaultdict
dictresult= defaultdict(list)
for key,value in files.items():
dictresult[value].append(key)
Voici une approche simple où nous parcourons les clés et valeurs de vos fichiers dict originaux et créons une liste pour chaque valeur à ajouter à tout clés correspondant à cette valeur.
files = {
'Input.txt': 'Randy',
'Code.py': 'Stan',
'Output.txt': 'Randy'
}
dictresult= {}
for k, v in files.items():
if v not in dictresult:
dictresult[v] = [k]
else:
dictresult[v].append(k)
print(dictresult) # -> {'Randy': ['Output.txt', 'Input.txt'], 'Stan': ['Code.py']}
Pouvez-vous expliquer cela un peu? Comment cela fonctionne sans l'utilisation de la méthode de mise à jour?
Je vais mieux cerner ma question, pourquoi uasking pour v n'est pas dans dict plutôt que v pas dans dict.keys ()
C'est la même chose.
Vous pouvez vérifier si la valeur en tant que clé existe dans dictresult
Like
dictresult= {}
for key,value in files.items():
if not value in dictresult: dictresult [value]=[]
dictresult[value].append(key)
output = {}
for key, value in files.items():
output[value] = output.get(value, []) + [key]
print(output)
# {'Randy':['Input.txt','Output.txt'], 'Stan':['Code.py']}
@Luis le vérifie aussi si son aide
Il y a quelques problèmes avec votre code.
Examinons:
Premièrement, vous obtenez une erreur de clé parce que vous essayez d'ajouter une valeur à la clé qui n'existe pas. Pourquoi? parce que dans votre déclaration précédente, vous avez ajouté une valeur à dict [clé] et maintenant vous essayez d'accéder / d'ajouter dict [valeur].
{'Randy': ['Input.txt', 'Output.txt'], 'Stan': ['Code.py']}
Vous attribuez une valeur à la clé nouvellement générée, sans aucune vérification. chaque nouvelle valeur l'écrasera.
d = {}
for key,value in files.items():
if value in d:
d[value].append(key)
else:
d[value] = [key]
print(d)
Vous pouvez obtenir ce que vous voulez avec le code suivant:
dictresult[value].append(key)
Il affichera:
dictresult[key]=value
Comment / pourquoi ça marche?
Voyons:
Voici deux façons de procéder.
from collections import defaultdict
files = {"Input.txt": "Randy", "Code.py": "Stan", "Output.txt": "Randy"}
expected = {"Randy": ["Input.txt", "Output.txt"], "Stan": ["Code.py"]}
# 1st method. Using defaultdict
inverted_dict = defaultdict(list)
{inverted_dict[v].append(k) for k, v in files.items()}
assert inverted_dict == expected, "1st method"
# 2nd method. Using regular dict
inverted_dict = dict()
for key, value in files.items():
inverted_dict.setdefault(value, list()).append(key)
assert inverted_dict == expected, "2nd method"
print("PASSED!!!")
Double possible de clés de commutation et valeurs dans un dictionnaire en python a>