Я хочу, чтобы вызвать реду со списком, который содержит длинные целые в Python - PullRequest
2 голосов
/ 15 августа 2011

Я пытаюсь вызвать сокращение в списке, содержащем целые и длинные. Например,

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

но я получаю неосуществленную ошибку. и когда я заменяю int метод mul на метод long long, он жалуется, что получает int. Должен ли я сопоставить их всех долго? как это.

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

Ответы [ 4 ]

7 голосов
/ 15 августа 2011
>>> 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'
5 голосов
/ 15 августа 2011

int.__mul__ может умножить только два целых числа, аналогично, long.__mul__ два длинных.Но обычный оператор * автоматически обрабатывает различные числовые типы для вас, поэтому вы можете просто использовать лямбду, которая переводит работу в '*':

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

Или да, используйте operator.mul но не забудьте сначала импортировать его!(Это, вероятно, будет быстрее, на самом деле)

3 голосов
/ 15 августа 2011

Вы хотите operator.mul.

2 голосов
/ 15 августа 2011

тебе не нужно это воображение reduce.

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

Это намного удобочитаемее и быстрее

...