2013-10-22 3 views
0

[1, 2] + [3, 4][1, 2, 3, 4]를 산출하는 것이 관찰, 나는 sum([[1, 2], [3, 4]])가 동일한 작업을 수행해야한다고 추론, 대신에이 오류가있어 :합산 두 목록 함께

TypeError: unsupported operand type(s) for +: 'int' and 'list' 

사람이 설명하시기 바랍니다 수 있습니까? itertools.chain을 사용할 수는 있지만 왜 작동하지 않는지 알고 있습니다.

+2

[sum'에 대한 문서] (http://docs.python.org/2/library/functions.html#sum)를 확인 했습니까? –

+0

"iterable의 항목은 일반적으로 숫자이고 시작 값은 문자열이 아니어야합니다."를 참조하십시오. 내 문제를 설명하지 않습니다. –

+2

@Brandon'시작과 반복 가능한 항목을 왼쪽에서 오른쪽으로 합계하고 합계를 반환합니다. 시작 값은 0입니다. 기본값은 0입니다 .'; '0 + [1,2]'를 할 수 없기 때문에'TypeError'를 얻을 수있다. –

답변

6

start defaults to 0.

source

sum(..., []) 
+0

네, 맞아,'sum [[1,2], [3,4]], [])' [1, 2, 3, 4] 질문 저자가 예상 한대로. – Waterlink

+0

'sum' *은 이것을 할 수 있지만 실제로는이 목적으로 사용해서는 안된다는 것에주의하십시오. 이 종류의'sum'은 결과 값의 끝 부분을 복사 할 때 마지막 값을 마지막에 복사 할 때 계속 복사해야하기 때문에'O (N ** 2)'시간이 걸릴 것입니다 (이것은 Schlemiel the Painter 알고리즘] (http://en.wikipedia.org/wiki/Schlemiel_the_Painter%27s_algorithm)). 'itertools.chain' (iterator가 아닌 list 객체가 필요하면'list'에 전달됩니다)는'O (N)'이 될 것입니다. – Blckknght

+0

@Blckknght 당신은 immutables (스트링과 같이, .join (string)이 더 좋고 O (N)이 더 좋은 이유입니다)에 맞을 수도 있지만리스트의 경우, 목록을 복사하려면 그냥 확장하면됩니다. 파이썬 3.3 문서, 4.6.1 절의 주석 6을 참조하십시오 (py 2.7에는 적용되지만 다른 절은 명확하게 설명되지 않음). 즉, 나는 테스트하지 않았다. – Schollii

0

sum는 다음을 수행합니다 :

  1. 입력 목록의 각 element에 대한 result = 0
  2. 를 초기화 : result += element
  3. 반환

따라서 두 번째 단계에서는 이러한 오류가 발생합니다. result += element을 시도하면 result = 0element = [1, 2]입니다. 이렇게하면 TypeError가 발생합니다. 당신이 합계 함수의 문서에서 볼 수 있듯이

+0

Burhan Khalid, 문서 링크. – Waterlink

+0

2 단계의 구현은 실제로는 'result = result + element'이며, 이는 변경 가능한 값에 대해'result + = element'와 약간 다른 의미를가집니다.'sum'은 타입이 ('list'가하는 것처럼) 타입을 가지고 있어도'__iadd__' 메소드를 사용하지 않을 것입니다. 그래서 전체 합계가 여러분이 기대하는 것보다 훨씬 비쌉니다 ('O (N ** 2) 'O (N)보다는 오히려'). [이 소스의 주석] (http://hg.python.org/cpython/file/e8cead08c556/Python/bltinmodule.c#l2414)을 참조하십시오. – Blckknght

-1

RESUME [이

sum([[1,2], [3,4]]) 

처럼 작동 합은 이전에 보유하고 있던 값으로 각각의 새로운 요소를 추가하여 작동합니다. 이 경우 [3,4] + 1을 추가하려고합니다. 그러면 목록을 추가하는 중 오류가 발생할 수 있으며 int는 의미가 없습니다.

+1

이 대답은 잘못되었습니다. 첫째,'sum ([1,2], [3,4]) '는 질문자가 물었던 것이 아닙니다. '[3,4]'를'start' 매개 변수로 전달합니다. 아마도 유용하지 않을 것입니다. 또한'sum' 호출은 여러분이 제안한대로 [1,2] + 3이 아니라'[3,4] + 1'을 추가하려고합니다. – Blckknght