2 votes

comparer une liste dans un dictionnaire python

Je dois comparer les clés d'un dictionnaire avec une liste.

l = {"Carlos": 1131577, "Rodrigo": 3250239, "Marisol": 1174787}

avec les mots en

d = "Carlos Marisol"

Pour chaque mot de la chaîne qui apparaît dans le dictionnaire, je voudrais additionner les valeurs correspondantes.

Le résultat devrait être quelque chose comme ceci :

2306364
Carlos Marisol

Le code que j'ai fait est le suivant :

l = {"Carlos": 1131577, "Rodrigo": 3250239, "Marisol": 1174787}
d = "Carlos Marisol"
a = d.split(' ')
n = 0
h = ""
f = len(a)
for k, v in l.items():
    if k == a[0] or k == a[1]:
        n += v
        h += k + " "
print(n)
print(h)

Le résultat est le suivant :

2306364
Carlos Marisol 

Comme vous pouvez le voir, cela fonctionne, mais MANUELLEMENT pour ainsi dire.

if k == a[0] or k == a[1]:

La variable a : a[0] , a[1] doit être itérable en fonction de ses positions, car ajouter une autre donnée ne fonctionne pas, comment faire ?

Car avec ces données, il ne fonctionne pas correctement :

l = {"Rodrigo": 2155029, "Sebastian": 3290180, "Camilo": 4271313, "Marisol": 2964688}
d = "Marisol Sebastian Ana Camilo"

6voto

Mad Physicist Points 3218

Vous utilisez les dictionnaires à l'envers. Les dictionnaires sont utilisés pour la recherche, les listes pour l'itération. Il existe de nombreuses façons de gérer le cas des clés manquantes.

Dans les exemples ci-dessous, j'utilise la fonction intégrée sum plutôt que d'écrire une boucle comme

n = 0
for w in d.split():
    n += d.get(w, 0)

Si tous vos noms sont dans le dictionnaire, vous pouvez faire une recherche directe :

sum(l[w] for w in d.split())

Si, d'autre part, vos noms ne sont pas garantis d'être en l vous pouvez utiliser l.get :

sum(l.get(w, 0) for w in d.split())

Cela donnera 10526181 pour votre deuxième exemple.

Une autre façon est d'utiliser collections.defaultdict para l puisque la valeur par défaut est int est égal à 0 :

l = collections.defaultdict(int, l)
sum(map(l.__getitem__, d.split()))

Ce site sum est équivalente à la première, mais ne se bloque pas en cas de noms manquants en raison de l'utilisation de l'option defaultdict .


Pour obtenir une chaîne contenant tous les noms du dictionnaire, vous pouvez utiliser une simple ligne simple :

' '.join(w for w in d.split() if w in l)

Alternativement, vous pouvez utiliser filter :

' '.join(filter(l.__contains__, d.split()))

2voto

Lei Yang Points 1052

Changez juste if k == a[0] or k == a[1]: à

if k in a:

1voto

LouisB Points 253

En supposant que les prénoms sont uniques dans l et dans d

total = 0
first_names = d.split(" ")
for first_name in first_names:
    if first_name in list(l.keys()):
        total += l[first_name]

1voto

Taron Qalashyan Points 325

Essayez ce code :

l = {"Rodrigo": 2155029, "Sebastian": 3290180, "Camilo": 4271313, "Marisol": 2964688}
d = "Marisol Sebastian Ana Camilo"
a = d.split(' ')
n = 0
h = ""
for b in a:
    if (b in l): 
        n += l[b]
        h += b + " "
print(n)
print(h)

1voto

Henty Points 106

Utiliser la compréhension, quelque chose comme :

existing_words = [k for k, _ in l if k in d]
result_num = 0
result_str = ''
for word in existing_words:
    result_num += l[word]
    result_str += word + ' '

print(result_num)
print(d)

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