Bir sözlükteki tüm değerler nasıl toplanır?


239

Diyelim ki anahtarlar gibi tamsayılara eşlenen bir sözlük var:

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

Değerlerin toplamını döndürmek için bir sözdizimsel minimalist yolu var mı d; yani 62bu durumda?


2
Sadece eğlence için: uygulamak sumaçısından kendinizi reduce- reduce(örn daha genel bir şeklidir sum, minve maxtüm cinsinden yazılabilir reduce) ve diğer sorunlar (örneğin çözebilir productkolayca).

1
Guido'nun - Sanırım bunu doğru hatırlıyorum - söz konusu azalma ortadan kalkıyor? Seninleyim. Neden dilden kaldırılsın?
octopusgrabbus

Yanıtlar:


471

Beklediğiniz gibi:

sum(d.values())

1
Peki, Python 2.7.12aynı zamanda iyi çalışıyorsum(d.values())
LancelotHolmes

7
@LancelotHolmes Evet, ancak bu bellekte bir liste oluşturur ve bu nedenle büyük sözlükler için kaynak sınırlarına daha yavaş / daha yakın olabilir. Böylece, bu cevap "ifadesinin bulunduğu edebilir " sen yerine kullanmak istediğiniz " olmalıdır Python 2. tartışırken kullanmak"
phihag

Güzel! Sadece böyle bir şey olacağını bildiğim için araştırdım. Gerçi döngü için ölü bir aptallık yazmak çok fazla iş gerektirmez;)
runlevel0

Python'u sevip sevmediğinizi, python 3'ü seviyorsanız veya gerçekten bir python 2'den bahsediyorsanız bilmiyorum
Lucas Vazquez

1
@LucasVazquez Bu, Python 2 (veya 1) ile ilgilidir. Bugünlerde ilgisiz olduğu için kaldırdım - Python2'de yeni kod yazsanız bile kullanabilirsiniz d.values().
phihag

70

Python 2'de itervalues(), sözlük anahtarlarının yinelemesini döndüren sözlük yöntemini kullanarak tüm değerlerin geçici bir kopyasını yapmaktan kaçınabilirsiniz :

sum(d.itervalues())

Python 3'te kullanabilirsiniz, d.values()çünkü bu yöntem bunu yapmak için değiştirildi (ve itervalues()artık gerekli olmadığından kaldırıldı).

Sözlüğün anahtarlarının değerleri üzerinde her zaman yinelenen sürüm bağımsız kod yazmayı kolaylaştırmak için, bir yardımcı program işlevi yardımcı olabilir:

import sys

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

sum(itervalues(d))

Bu aslında Benjamin Peterson'in sixmodülünün yaptığı şey.


5
Evet, bu python 3 için geçerli olmasa da
tokland

15

Elbette var. İşte bir sözlüğün değerlerini toplamanın bir yolu.

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

for döngüsünü kullanarak yapabilirsiniz


3

Ben hissediyorum sum(d.values())toplamını almak için en etkili yoldur.

Toplamı lambda ifadesiyle birlikte hesaplamak için azaltma işlevini de deneyebilirsiniz:

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


0

phihag'ın yanıtı (ve benzerleri) python3'te çalışmaz.

Python 3 için:

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

Güncelleme! İşe yaramadığı şikayetleri var! Terminalimden bir ekran görüntüsü ekliyorum. Sürümlerde vb. Bir uyumsuzluk olabilir.

resim açıklamasını buraya girin


Bu sorunu denesek bile aynı sorun var
jeevan kishore

benim için iyi çalışıyor! Cevabımı bir ekran görüntüsü ile güncelledim (burada yapamıyorum); sürümleri ile ilgili bir şey olabilir ...
Reza

0

Bunun için 'for döngüsünü' düşünebilirsiniz:

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

toplam = 800


1
Ya da sadece sum(d.values()), çünkü .values()getiri bir List.
Linny

evet bu başka bir yol.
Rahul Patel

-1

Sözlükteki tüm değerlerin bir oluşturucusunu alıp bir listeye yayınlayabilir ve tüm değerlerin toplamını almak için sum () işlevini kullanabilirsiniz.

Misal:

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

sum(list(c.values()))

1
Eğer işe yaramazsa, bu nasıl bir cevaptır. Daha çok diğer cevapların yorumuna benziyor.
Martin Thøgersen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.