Bagaimana menjumlahkan semua nilai dalam kamus?

239

Katakanlah saya memiliki kamus tempat kunci memetakan seperti:

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

Apakah ada cara minimalistik sintaksis untuk mengembalikan jumlah nilai dalam d—yaitu 62dalam kasus ini?

nedblorf
sumber
2
Hanya untuk bersenang-senang: laksanakan sumdiri Anda dalam hal reduce- reduceadalah bentuk yang lebih umum (mis. sum, minDan maxsemuanya dapat ditulis dalam bentuk reduce) dan dapat memecahkan masalah lain (misalnya product) dengan mudah.
1
Bagaimana dengan ucapan Guido - saya pikir saya ingat ini dengan benar - bahwa pengurangan akan hilang? Aku bersamamu. Mengapa menghapusnya dari bahasa?
octopusgrabbus

Jawaban:

471

Seperti yang Anda harapkan:

sum(d.values())
phihag
sumber
1
Yah, Python 2.7.12juga bekerja dengan baik dengansum(d.values())
LancelotHolmes
7
@LancelotHolmes Ya, tapi itu membangun daftar di memori, dan karenanya bisa lebih lambat / lebih dekat ke batas sumber daya untuk kamus besar. Jadi, jawaban ini mengatakan "Anda mungkin ingin menggunakan" alih-alih "Anda harus menggunakan" ketika membahas Python 2.
phihag
Bagus! Saya mencarinya hanya karena saya tahu akan ada sesuatu seperti itu. Bukan berarti butuh terlalu banyak pekerjaan untuk menulis konyol konyol untuk loop;)
runlevel0
Saya tidak tahu apakah Anda suka python, apakah Anda suka python 3, atau apakah benar-benar mengacu pada python 2
Lucas Vazquez
1
@LucasVazquez Ini disebut Python 2 (atau 1). Saya menghapusnya karena ini tidak relevan saat ini - bahkan jika Anda menulis kode baru di Python2, Anda dapat menggunakan d.values().
phihag
70

Dalam Python 2 Anda dapat menghindari membuat salinan sementara dari semua nilai dengan menggunakan itervalues()metode kamus, yang mengembalikan iterator dari kunci kamus:

sum(d.itervalues())

Dalam Python 3 Anda bisa menggunakan d.values()karena metode itu diubah untuk melakukan itu (dan itervalues()dihapus karena tidak lagi diperlukan).

Untuk membuatnya lebih mudah untuk menulis kode independen versi yang selalu berulang di atas nilai-nilai kunci kamus, fungsi utilitas dapat membantu:

import sys

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

sum(itervalues(d))

Ini pada dasarnya adalah apa yang sixmodul Benjamin Peterson lakukan.

martineau
sumber
5
ya, meskipun ini tidak berlaku untuk python 3.
tokland
15

Tentu ada. Berikut adalah cara untuk menjumlahkan nilai-nilai kamus.

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

Anda dapat melakukannya menggunakan for loop

Kalyan Pendyala
sumber
3

Saya merasa sum(d.values())adalah cara paling efisien untuk mendapatkan jumlah.

Anda juga dapat mencoba fungsi pengurangan untuk menghitung jumlah beserta ekspresi lambda:

reduce(lambda x,y:x+y,d.values())
Pratyush Raizada
sumber
1

sum (d.values ​​()) - "d" -> Variabel kamus Anda

Behlul Valiyev
sumber
0

Jawaban phihag (dan yang serupa) tidak akan berfungsi di python3.

Untuk python 3:

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

Memperbarui! Ada keluhan bahwa itu tidak berhasil! Saya hanya melampirkan tangkapan layar dari terminal saya. Mungkin ada beberapa ketidakcocokan dalam versi dll.

masukkan deskripsi gambar di sini

Reza
sumber
Masalah yang sama ada bahkan jika kita mencoba cara ini
jeevan kishore
itu berfungsi dengan baik untuk saya! Saya memperbarui jawaban saya dengan tangkapan layar (tidak bisa melakukannya di sini); mungkin ada hubungannya dengan versi ...
Reza
0

Anda dapat mempertimbangkan 'for loop' untuk ini:

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

total = 800

Rahul Patel
sumber
1
Atau adil sum(d.values()), karena .values()mengembalikan a List.
Linny
ya itu cara lain juga.
Rahul Patel
-1

Anda bisa mendapatkan generator dari semua nilai dalam kamus, lalu melemparkannya ke daftar dan menggunakan fungsi sum () untuk mendapatkan jumlah semua nilai.

Contoh:

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

sum(list(c.values()))
pengguna12988654
sumber
1
Bagaimana ini jawaban, jika tidak berhasil. Terlihat lebih seperti komentar untuk jawaban lain.
Martin Thøgersen