사전의 모든 값을 합산하는 방법은 무엇입니까?


239

키가 정수와 매핑되는 사전이 있다고 가정 해 보겠습니다.

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

의 값의 합을 반환하는 구문 최소한의 방법이 d- 즉 62이 경우는?


2
그냥 재미를 위해 : 구현 sum의 관점에서 자신을 reduce- reduce(예를 들어,보다 일반적인 형태 sum, min그리고 max모든면에서 쓸 수있다 reduce) 및 기타 문제 (예를 들면 해결할 수 있습니다 product쉽게 참조).

1
귀도의 말은 어떻습니까? 정확히 기억합니다. 감소가 사라질까 요? 난 너와 함께있어. 언어에서 왜 제거해야합니까?
— octopusgrabbus 2016 년

답변:


471

예상대로 :

sum(d.values())

1
음, Python 2.7.12또한 잘 작동sum(d.values())
— LancelotHolmes

7
@LancelotHolmes 예, 그러나 메모리에 목록을 작성하므로 큰 사전의 리소스 제한에 더 느리거나 더 근접 할 수 있습니다. 따라서,이 대답은 "당신이라고 할 수있다 "당신이 대신 사용하려면 " 해야한다 파이썬 2. 논의 할 때 사용하는"
— phihag

좋은! 나는 그런 것이있을 것이라는 것을 알았 기 때문에 그것을 찾았습니다. 그것은 루프 불구을 위해 죽은 바보를 작성하는 너무 많은 작업을 필요하지 않는 것이)
— runlevel0

파이썬을 좋아하는지, 파이썬 3을 좋아하는지, 아니면 실제로 파이썬 2를 언급하고 있는지 모르겠습니다.
— Lucas Vazquez

1
@LucasVazquez 이것은 Python 2 (또는 1)를 나타냅니다. 요즘은 관련이 없기 때문에 제거했습니다 d.values(). Python2에서 새 코드를 작성하더라도을 사용할 수 있습니다 .
— phihag

70

파이썬 2에서는 itervalues()사전의 키 반복자를 반환하는 사전 메소드 를 사용하여 모든 값을 임시로 복사하지 않아도됩니다.

sum(d.itervalues())

파이썬 3에서는 d.values()그 메소드가 변경되어 itervalues()더 이상 필요하지 않기 때문에 제거 되었기 때문에 사용할 수 있습니다 .

사전의 키 값을 항상 반복하는 버전 독립적 인 코드를보다 쉽게 ​​작성하려면 유틸리티 기능이 도움이 될 수 있습니다.

import sys

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

sum(itervalues(d))

이것은 본질적으로 Benjamin Peterson의 six모듈이하는 일입니다.


5
그래, 이것은 파이썬 3. 적용되지 않지만
— tokland

15

물론입니다. 사전 값을 합산하는 방법은 다음과 같습니다.

>>> 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 루프를 사용하여 그것을 할 수 있습니다


3

나는 sum(d.values())합계를 얻는 가장 효율적인 방법 이라고 생각 합니다.

reduce 함수를 사용하여 람다 식과 함께 합계를 계산할 수도 있습니다.

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


0

phihag의 답변 (및 유사한 답변)은 python3에서 작동하지 않습니다.

파이썬 3의 경우 :

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

최신 정보! 작동하지 않는다는 불만이 있습니다! 터미널에서 스크린 샷을 첨부하면됩니다. 버전 등에서 일부 불일치가있을 수 있습니다.

여기에 이미지 설명을 입력하십시오


우리가 이런 식으로 시도하더라도 동일한 문제가 존재합니다
— jeevan kishore

그것은 나를 위해 잘 작동합니다! 스크린 샷으로 답변을 업데이트했습니다 (여기서는 할 수 없습니다). 버전과 관련이있을 수 있습니다 ...
— 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

네, 다른 방법이기도합니다.
— Rahul Patel

-1

사전에있는 모든 값의 생성기를 가져온 다음 목록으로 캐스트하고 sum () 함수를 사용하여 모든 값의 합계를 얻을 수 있습니다.

예:

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

sum(list(c.values()))

1
이것이 효과가 없다면 어떻게 대답할까요? 다른 답변에 대한 의견처럼 보입니다.
— 마틴 토 거센
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.