4
votes

Comment changer de valeur et de clé avec python dict?

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 :


1
votes

Essayez d'utiliser defaultdict -

from collections import defaultdict
dictresult= defaultdict(list)
for key,value in files.items():
     dictresult[value].append(key)


0 commentaires

5
votes

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']}


3 commentaires

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.



0
votes

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)


0 commentaires

0
votes
output = {}
for key, value in files.items():
    output[value] = output.get(value, []) + [key]

print(output)
# {'Randy':['Input.txt','Output.txt'], 'Stan':['Code.py']}

1 commentaires

@Luis le vérifie aussi si son aide



4
votes

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)
    
  • Ensuite, vous essayez d'ajouter une nouvelle valeur à une chaîne en utilisant une mauvaise clé.

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:

  • La condition if vérifie si cette clé est déjà présente dans le dictionnaire. Lorsqu'il est itéré sur un dictionnaire, il renvoie uniquement ses clés, pas des paires clé-valeur contrairement à dict.items ()
  • Si la clé est là, nous lui ajoutons simplement la valeur actuelle.
  • Dans les autres cas, où cette clé n'est pas présente, nous ajoutons une nouvelle clé au dictionnaire mais nous le faisons en la castant dans une liste, sinon une chaîne serait insérée en tant que valeur, pas en liste et vous ne le ferez pas pouvoir y ajouter.


0 commentaires

0
votes

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!!!")


0 commentaires