2011-12-31 37 views
85

Tôi đang sử dụng Python 3.2. Cố gắng này:NameError: tên 'reduce' không được định nghĩa trong Python

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

Và có những lỗi sau đây:

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

cố gắng in reduce vào giao diện điều khiển tương tác - đã nhận lỗi này:

NameError: name 'reduce' is not defined 


reduce thực sự loại bỏ trong Python 3.2 ? Nếu đó là trường hợp, thay thế là gì?

+3

@JBernardo, đúng công cụ là gì? – Sergey

Trả lời

139

Nó đã được chuyển đến functools.

+25

nooooooo! có thật không? tại sao? – juliomalegria

+25

@ julio.alegria: Vì [Guido ghét nó] (http://www.artima.com/weblogs/viewpost.jsp?thread=98196). –

+2

Bài viết được đề cập trong @ IgnacioVazquez-Abrams làm cho một số điểm thực sự tốt về cách hầu hết các trường hợp có thể được viết theo một cách dễ đọc hơn. Đối với tôi, đó là bằng cách viết 'sum (item ['key'] cho item trong list_of_dicts)'. – connorbode

1

Trong trường hợp này, tôi tin rằng sau đây là tương đương:

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

Vấn đề duy nhất với điều này là nó tạo ra số lượng lớn, nhưng có lẽ đó là tốt hơn so với các hoạt động lặp đi lặp lại modulo?

+0

Điều này cũng chắc chắn hiệu quả hơn đáng kể ... – naught101

+0

Yep ... với hệ số trên 20 cho n = 10000 ... – naught101

70

Bạn có thể thêm

from functools import reduce 

trước khi sử dụng giảm.

+0

Người dùng trước đã trả lời câu hỏi và câu trả lời giống với câu trả lời của anh ấy –

1

Hoặc nếu bạn sử dụng sáu thư viện

from six.moves import reduce 
Các vấn đề liên quan