Come sommare tutti i valori in un dizionario?


239

Diciamo che ho un dizionario in cui le chiavi sono mappate a numeri interi come:

d = {'key1': 1,'key2': 14,'key3': 47}

Esiste un modo sintatticamente minimalista per restituire la somma dei valori in d—ie 62in questo caso?


2
Solo per divertimento: implementati sumin termini di reduce- reduceè una forma più generale (ad es sum. minE maxpuò essere scritta in termini di reduce) e può risolvere productfacilmente altri problemi (ad es. ).

1
Che dire del detto di Guido - penso di ricordarmelo correttamente - che la riduzione sta andando via? Sono con te. Perché rimuoverlo dalla lingua?
octopusgrabbus,

Risposte:


471

Come ti aspetteresti:

sum(d.values())

1
Bene, Python 2.7.12funziona anche bene consum(d.values())
LancelotHolmes il

7
@LancelotHolmes Sì, ma crea un elenco in memoria e può quindi essere più lento / vicino ai limiti delle risorse per dizionari di grandi dimensioni. Così, questa risposta dice: "si potrebbe voler usare" invece di "si deve usare" quando si parla di Python 2.
phihag

Bello! L'ho cercato solo perché sapevo che ci sarebbe stato qualcosa del genere. Non che ci vuole troppo lavoro per scrivere uno sciocco morto per loop;)
runlevel0

Non so se ami Python, se ami Python 3, o se davvero ti riferisci a un Python 2
Lucas Vazquez,

1
@LucasVazquez Questo si riferiva a Python 2 (o 1). L'ho rimosso dal momento che è irrilevante al giorno d'oggi - anche se scrivi nuovo codice in Python2, puoi usarlo d.values().
phihag,

70

In Python 2 puoi evitare di creare una copia temporanea di tutti i valori utilizzando il itervalues()metodo del dizionario, che restituisce un iteratore delle chiavi del dizionario:

sum(d.itervalues())

In Python 3 puoi semplicemente usare d.values()perché quel metodo è stato modificato per farlo (ed è itervalues()stato rimosso dal momento che non era più necessario).

Per semplificare la scrittura di codice indipendente dalla versione che scorre sempre sui valori delle chiavi del dizionario, può essere utile una funzione di utilità:

import sys

def itervalues(d):
    return iter(getattr(d, ('itervalues', 'values')[sys.version_info[0]>2])())

sum(itervalues(d))

Questo è essenzialmente ciò che sixfa il modulo di Benjamin Peterson .


5
Sì, anche se questo non vale per Python 3.
tokland

15

Certo che c'è. Ecco un modo per sommare i valori di un dizionario.

>>> d = {'key1':1,'key2':14,'key3':47}
>>> sum(d.values())
62

4
d = {'key1': 1,'key2': 14,'key3': 47}
sum1 = sum(d[item] for item in d)
print(sum1)

puoi farlo usando il ciclo for


3

Penso che sum(d.values())sia il modo più efficiente per ottenere la somma.

Puoi anche provare la funzione di riduzione per calcolare la somma insieme a un'espressione lambda:

reduce(lambda x,y:x+y,d.values())


0

La risposta di phihag (e simili) non funzionerà in python3.

Per Python 3:

d = {'key1': 1,'key2': 14,'key3': 47}
sum(list(d.values()))

Aggiornare! Ci sono lamentele sul fatto che non funziona! Allego solo uno screenshot dal mio terminale. Potrebbe esserci qualche discrepanza nelle versioni ecc.

inserisci qui la descrizione dell'immagine


Lo stesso problema esiste anche se proviamo in questo modo
jeevan kishore il

funziona bene per me! Ho aggiornato la mia risposta con uno screenshot (non posso farlo qui); potrebbe avere qualcosa a che fare con le versioni ...
Reza,

0

Potresti considerare 'for loop' per questo:

  d = {'data': 100, 'data2': 200, 'data3': 500}
  total = 0
  for i in d.values():
        total += i

totale = 800


1
O semplicemente sum(d.values()), poiché .values()restituisce a List.
Linny,

sì, anche questo è un altro modo.
Rahul Patel,

-1

È possibile ottenere un generatore di tutti i valori nel dizionario, quindi eseguirne il cast in un elenco e utilizzare la funzione sum () per ottenere la somma di tutti i valori.

Esempio:

c={"a":123,"b":4,"d":4,"c":-1001,"x":2002,"y":1001}

sum(list(c.values()))

1
Come è una risposta, se non funziona? Assomiglia di più a un commento ad altre risposte.
Martin Thøgersen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.