วิธีรวมค่าทั้งหมดในพจนานุกรมได้อย่างไร


239

สมมติว่าฉันมีพจนานุกรมที่ปุ่มจับคู่กับจำนวนเต็มเช่น:

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

มีวิธีการที่เรียบง่ายในการซินdแทกติกเพื่อคืนค่าผลรวมของ- 62ในกรณีนี้หรือไม่?


2
เพียงเพื่อความสนุกสนาน: ใช้sumตัวเองในแง่ของreduce- reduceเป็นรูปแบบทั่วไปมากขึ้น (เช่นsum, minและmaxทุกคนสามารถเขียนได้ในแง่ของการreduce) และสามารถแก้ปัญหาอื่น ๆ (เช่นproduct) ได้อย่างง่ายดาย

1
สิ่งที่เกี่ยวกับคำพูดของกุยโด้ - ฉันคิดว่าฉันจำได้ถูกต้อง - การลดลงนั้นจะหายไป? ฉันอยู่กับคุณ ทำไมลบออกจากภาษา?
octopusgrabbus

คำตอบ:


471

ตามที่คุณคาดหวัง:

sum(d.values())

1
ดีPython 2.7.12ยังทำงานได้ดีกับsum(d.values())
LancelotHolmes

7
@LancelotHolmes ใช่ แต่นั่นจะสร้างรายการในหน่วยความจำและทำให้ช้าลง / ใกล้เคียงกับข้อ จำกัด ทรัพยากรสำหรับพจนานุกรมขนาดใหญ่ ดังนั้นคำตอบนี้บอกว่า "คุณอาจต้องการใช้" แทน "คุณต้องใช้" เมื่อพูดถึง Python 2
phihag

ดี! ฉันค้นหามันเพียงเพราะฉันรู้ว่าจะมีบางอย่างเช่นนั้น ไม่ว่าจะใช้เวลาทำงานมากเกินไปที่จะเขียนตายโง่สำหรับวงแม้ว่า;)
runlevel0

ฉันไม่ทราบว่าคุณรักหลามหรือไม่ถ้าคุณรักหลาม 3 หรือถ้าอ้างถึงงูหลาม 2 จริงๆ
ลูคั

1
@LucasVazquez สิ่งนี้เรียกว่า Python 2 (หรือ 1) ฉันลบมันออกเนื่องจากมันไม่เกี่ยวข้องในปัจจุบัน - แม้ว่าคุณจะเขียนโค้ดใหม่ใน Python2 คุณก็สามารถd.values()ใช้ได้
Phihag

70

ใน Python 2 คุณสามารถหลีกเลี่ยงการทำสำเนาค่าทั้งหมดชั่วคราวโดยใช้itervalues()วิธีการพจนานุกรมซึ่งจะคืนค่าตัววนซ้ำของคีย์ของพจนานุกรม:

sum(d.itervalues())

ใน Python 3 คุณสามารถใช้เพียงd.values()เพราะวิธีการนั้นเปลี่ยนไปเพื่อทำเช่นนั้น (และitervalues()ถูกลบออกเพราะไม่ต้องการอีกต่อไป)

เพื่อให้ง่ายต่อการเขียนโค้ดอิสระของเวอร์ชันซึ่งวนซ้ำกว่าค่าของคีย์ของพจนานุกรมเสมอฟังก์ชั่นยูทิลิตี้จะมีประโยชน์:

import sys

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

sum(itervalues(d))

นี่คือสิ่งที่sixโมดูลของ Benjamin Peterson ทำ


5
yup แม้ว่าจะไม่ได้ใช้กับ python 3
tokland

15

แน่นอนว่ามี นี่คือวิธีการรวมค่าของพจนานุกรม

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


3

ฉันรู้สึกว่าsum(d.values())เป็นวิธีที่มีประสิทธิภาพที่สุดในการรับผลรวม

คุณสามารถลองใช้ฟังก์ชั่นการลดเพื่อคำนวณผลรวมพร้อมกับการแสดงออกแลมบ์ดา:

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


0

คำตอบของ phihag (และคำที่คล้ายกัน) จะไม่ทำงานใน python3

สำหรับหลาม 3:

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

Update! มีคนบ่นว่ามันใช้งานไม่ได้! ฉันเพิ่งแนบภาพหน้าจอจากเทอร์มินัลของฉัน อาจไม่ตรงกันในบางรุ่นและอื่น ๆ

ป้อนคำอธิบายรูปภาพที่นี่


มีปัญหาเดียวกันแม้ว่าเราจะลองด้วยวิธีนี้
jeevan

มันใช้งานได้ดีสำหรับฉัน! ฉันอัพเดตคำตอบด้วยภาพหน้าจอ (ไม่สามารถทำได้ที่นี่); มันอาจจะมีบางอย่างที่เกี่ยวข้องกับเวอร์ชัน ...
Reza

0

คุณสามารถพิจารณา 'for loop' สำหรับสิ่งนี้:

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

รวม = 800


1
หรือเพียงแค่sum(d.values())เนื่องจากผลตอบแทน.values() List
Linny

ใช่นั่นเป็นอีกวิธีหนึ่งเช่นกัน
ราหุลปาเทล

-1

คุณสามารถรับตัวสร้างค่าทั้งหมดในพจนานุกรมจากนั้นนำไปสร้างเป็นรายการและใช้ฟังก์ชัน sum () เพื่อรับผลรวมของค่าทั้งหมด

ตัวอย่าง:

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

sum(list(c.values()))

1
นี่เป็นคำตอบอย่างไรถ้ามันไม่ทำงาน ดูเหมือนความคิดเห็นต่อคำตอบอื่น ๆ
Martin Thøgersen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.