2011-08-15 2 views
2

int 및 long을 포함하는 목록에서 reduce를 호출하려고합니다. 예 :파이썬에서 ints가 longs를 포함하는 목록으로 reduce를 호출하려고합니다.

reduce(int.__mul__, [ 231212312412L, 3 ], 1) 

그러나 구현되지 않은 오류가 발생합니다. 그리고 int의 mul 메쏘드를 long의 mul 메쏘드로 대체하면 int를 얻는다 고 불평합니다. 오랫동안 먼저지도를 모두 붙여야합니까? 이렇게.

reduce(long.__mul__, map(long, [ 12312412314L, 5 ]), 1L) 
+0

또한 초기 값을 지정할 필요가 없습니다, 그것은 시작하는 순서에서 첫 번째 두 항목이 소요됩니다. – agf

+2

그냥'for' 루프를 만드십시오. 더 빠르고 읽기 쉽습니다. – JBernardo

답변

7
>>> from operator import mul 
>>> reduce(mul, map(long, [ 12312412314L, 5 ]), 1) 
61562061570L 
>>> reduce(mul, [ 231212312412L, 3 ], 1) 
693636937236L 
>>> 

운영자가 (즉 아마 실제로, 빠른 것). 훨씬 더 읽기 쉽고입니다

total = 1 
for x in your_list: 
    total *= x 

빠른

5

은 두 개의 정수만 곱할 수 있으며, 마찬가지로 두 개의 정수는 long.__mul__입니다.

reduce(lambda x,y: x*y, [ 231212312412L, 3 ], 1) 

또는 예, operator.mul를 사용하지만 가져와야 :하지만 정상 * 운영자는 자동으로 '*'그래서 당신이 할 수있는 일이 단순히 작품에 전원을 전달하는 람다를 사용한다, 당신을 위해 다른 숫자 유형을 처리합니다 먼저!

'abs', 
'add', 
'and_', 
'attrgetter', 
'concat', 
'contains', 
'countOf', 
'delitem', 
'delslice', 
'div', 
'eq', 
'floordiv', 
'ge', 
'getitem', 
'getslice', 
'gt', 
'iadd', 
'iand', 
'iconcat', 
'idiv', 
'ifloordiv', 
'ilshift', 
'imod', 
'imul', 
'index', 
'indexOf', 
'inv', 
'invert', 
'ior', 
'ipow', 
'irepeat', 
'irshift', 
'isCallable', 
'isMappingType', 
'isNumberType', 
'isSequenceType', 
'is_', 
'is_not', 
'isub', 
'itemgetter', 
'itruediv', 
'ixor', 
'le', 
'lshift', 
'lt', 
'methodcaller', 
'mod', 
'mul', 
'ne', 
'neg', 
'not_', 
'or_', 
'pos', 
'pow', 
'repeat', 
'rshift', 
'sequenceIncludes', 
'setitem', 
'setslice', 
'sub', 
'truediv', 
'truth', 
'xor' 
2

당신이 그 화려한 reduce 필요하지 않습니다 :

관련 문제