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?


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())

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.


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

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

Anda dapat melakukannya menggunakan for loop


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())


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


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


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()))

1
Bagaimana ini jawaban, jika tidak berhasil. Terlihat lebih seperti komentar untuk jawaban lain.
Martin Thøgersen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.