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


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.