python - sum() funtion
일단 기본 문법
sum(iterable[, start])
#구글 번역Return the sum of a
start value (default: 0) plus an
iterable of numbers(
start값 (기본값 : 0)과
반복 가능한 숫자의 합을 반환합니다.)
일단 사용법
a = [1,2,3]
sum(a)
6
이렇게 연속적으로 나타나는 숫자들(list, tuple, dict)의 각 요소들의 합을 구해 주는 함수이다.
거기에 start parameters(default = 0)이 추가된다면 start 항목을 더해주고 시작한다고 한다.
a = [1,2,3]
sum(a, 10)
16
문제 발생
그런데 여기서 리스트안의 리스트가 들어가면서 문제가 발생했다.
하...이게 어려운게...죄다 영어라 어디 물어볼데가 마땅찮았다.
a = [[1,2,3],[4,5,6]]
sum(a)
Traceback (most recent call last):
File "", line 1, in <module>
sum(a)
TypeError: unsupported operand type(s) for +: 'int' and 'list'
이렇게 리스트 안에 리스트가 들어가는 경우
list 와 'int' 의 타입이 맞지 않는다고 오류를 뿜어낸다.
타입문제를 해결하기위해
오늘의 유머에 질문글을 올리고 많은 답변을 받았다.
해결 과정
답변을 보면
a = [[1,2,3],[4,5,6]]
sum(a, [])
[1, 2, 3, 4, 5, 6]
이렇게 하라고 나오는데 왜 start 부분에 빈 리스트를 넣어주는지 이해가 가지 않았다.
친절한 답변으로
stackoverflow 글을 보고 대충 이해를 하게 되었다.
python 에 기본적으로 들어있는 sum() 함수를 아래처럼 생각하면 된다.
def sum(values, start = 0):
total = start
for value in values:
total = total + value
return total
여기서 보면, start 는 더해줄 숫자가 올수도 있고, list, tuple, dict 의 type이 올 수도 있다는 것이다.
즉 start라는 인수를 데이터가 현재 가진 type 으로, 반환값을 담을 type 정도로 생각하고, 그 type에 하나씩 채워 나간다 라고 생각하는 것이다.(start 값은 반환값과 합계되는 항목에 대한 type 정의)
간단한 예
import random as r
from collections import Counter
num = []
num = [r.sample(range(1, 13),5) for i in range(10)]
print("랜덤수 : ", num)
랜덤수 : [[2, 4, 5, 8, 10], [1, 7, 3, 5, 12], [11, 9, 4, 10, 6], [9, 3, 2, 1, 8], [10, 8, 2, 9, 7], [5, 1, 2, 4, 6], [10, 9, 7, 4, 11], [10, 1, 3, 8, 5], [2, 12, 10, 6, 7], [4, 5, 2, 6, 7]]
print("랜덤수의 묶음 : ", sum(num, []))
랜덤수의 합 : [2, 4, 5, 8, 10, 1, 7, 3, 5, 12, 11, 9, 4, 10, 6, 9, 3, 2, 1, 8, 10, 8, 2, 9, 7, 5, 1, 2, 4, 6, 10, 9, 7, 4, 11, 10, 1, 3, 8, 5, 2, 12, 10, 6, 7, 4, 5, 2, 6, 7]
참고사이트
#python3 #sum #함수 #iterable #start #stackoverflow #오늘의유머 #오유 #collections # Counter