2

我试图在包含整数和长整数的列表上调用 reduce。例如,

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

但我得到一个未实现的错误。当我用 long 的 mul 方法替换 int 的 mul 方法时,它抱怨它正在获取一个 int。我必须先将它们全部映射到 long 吗?像这样。

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

4 回答 4

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

运营商有:

'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'
于 2011-08-15T07:44:25.920 回答
5

int.__mul__只能将两个整数相乘,同样,long.__mul__两个长整数。但是普通*运算符会自动为您处理不同的数字类型,所以您可以简单地使用一个将工作传递给 '*' 的 lambda:

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

或者是的,使用operator.mul但记得先导入它!(实际上,这可能会更快)

于 2011-08-15T07:43:55.577 回答
3

你想要operator.mul

于 2011-08-15T07:40:42.737 回答
2

你不需要那么花哨reduce

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

这更具可读性和更快

于 2011-08-15T09:00:32.313 回答