NameError: имя 'Reduce' не определено в Python


188

Я использую Python 3.2. Пробовал это:

xor = lambda x,y: (x+y)%2
l = reduce(xor, [1,2,3,4])

И получил следующую ошибку:

l = reduce(xor, [1,2,3,4])
NameError: name 'reduce' is not defined

Пробовал печатать reduceв интерактивную консоль - получил эту ошибку:

NameError: name 'reduce' is not defined


Является ли на reduceсамом деле удалены в Python 3.2? Если это так, какова альтернатива?


3
@JBernardo, каков правильный инструмент?
Сергей

Ответы:


281

Он был перенесен в functools.



6
Статья, на которую ссылается @ IgnacioVazquez-Abrams, дает несколько хороших замечаний о том, как большинство случаев можно написать более читабельным образом. Для меня это написано sum(item['key'] for item in list_of_dicts).
Коннорбоуд

196

Можете добавить

from functools import reduce

прежде чем использовать уменьшить.


3
Предыдущий пользователь уже ответил на вопрос, и ответ такой же, как и у его ответа
Kathiravan Natarajan

8

Или если вы используете шесть библиотек

from six.moves import reduce

3

В этом случае я считаю, что следующее эквивалентно:

l = sum([1,2,3,4]) % 2

Единственная проблема в том, что он создает большие числа, но, может быть, это лучше, чем повторяющиеся операции по модулю?


Повторные операции по модулю полезны, когда они помогают сохранять малые числа. Суммирование чисел не приведет к созданию больших чисел, если вы не сложите много чисел, поэтому в этом случае это не поможет. Тем более, что это не позволяет использовать встроенную функцию суммирования, которая будет работать намного быстрее, чем повторное применение пользовательской функции
HackerBoss
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.