3 votes

Comment créer un dictionnaire à partir de deux listes en python tout en conservant toutes les informations sur les valeurs des clés ?

Exemple :

last_names = ['Bakir','Jose','Jose','Pierce']

university = ['Davis', 'Stanford', 'George Town', 'Berkeley']

Désirez ce qui suit

resulting_dictionary = {'Bakir':'Davis', 'Jose': ['Stanford', 'George Town'], 'Pierce':'Berkeley'}

J'ai essayé ce qui suit

dictionary = {key:value for key, value in zip(last_names, university)}

Mais j'ai obtenu ce qui suit :

{'Bakir': 'Davis', 'Jose': 'George Town', 'Pierce': 'Berkeley'}

En raison d'une valeur de clé dupliquée dans la liste des noms de famille.

Qu'en pensez-vous ?

5voto

Daniel Sanchez Points 2626

Utilice defaultdict

from collections import defaultdict

d = defaultdict(list)
for k, v in zip(last_names, university):
    d[k].append(v)

1voto

blhsing Points 57682

Vous pouvez utiliser le dict.setdefault pour initialiser de nouvelles clés avec des sous-listes :

dictionary = {}
for k, v in zip(last_names, university):
    dictionary.setdefault(k, []).append(v)

0voto

Barmar Points 135986

Vous devez définir la valeur dans une liste, et vérifier si la clé existe déjà et l'ajouter.

dictionary = {}
for key, value in zip(last_names, university):
    if key in dictionary:
        dictionary[key].append(value)
    else:
        dictionary[key] = [value]

Cela rendra toutes les listes de valeurs. C'est généralement plus facile si vous êtes cohérent sur le format de vos données, sans mélanger les chaînes de caractères et les listes. Le résultat sera donc :

{'Bakir':['Davis'], 'Jose': ['Stanford', 'George Town']], 'Pierce':['Berkeley']}

0voto

AJNeufeld Points 6563

En supposant, comme la question semble l'impliquer, qu'une liste n'est pas souhaitée si une seule valeur est présente pour une clé, une simple post-étape d'aplatissement peut être utilisée pour obtenir le résultat spécifié.

from collections import defaultdict

d = defaultdict(list)
for k, v in zip(last_names, university):
   d[k].append(v)

# flatten single entry lists back to a string
d = { k: v[0] if len(v) == 1 else v for k, v in d.items() }

0voto

Edward Aung Points 530

Essayez ça :

my_dict = {}
for key, value in zip(last_names, university):
    if key in my_dict:
        old_value = my_dict[key]
        if isinstance (old_value, str):
            my_dict[key] = [old_value, value]
        else:
            old_value.add (value)
    else:
        my_dict[key] = value

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X