công trình Làm thế nào giảm khoảng 30%:
# type annotations:
# reduce(lambda X,X:X, [X,X..]) -> X
# SAME <-- result
# ↗ ↖
# SAME SAME]
# ↗ ↖
# SAME SAME,
# ↗ ↖
# [SAME, SAME,
>>> reduce(lambda a,b:[a,b], [1,2,3,4])
[[[1, 2], 3], 4]
Đây là cách giảm hạt giống (còn gọi là gấp trái) hoạt động:
# type annotations:
# reduce(lambda REDU,ELEM:REDU, [ELEM,ELEM..], seed=REDU) -> REDU
# REDU <-- result
# ↗ ↖
# REDU ELEM]
# ↗ ↖
# REDU ELEM,
# ↗ ↖
# REDU ELEM,
# ↗ ↖
# REDU [ELEM,
>>> reduce(lambda a,b:[a,b], [1,2,3,4], 'seed')
[[[['seed', 1], 2], 3], 4]
Bạn muốn:
maxValue,maxIndex = reduce(
lambda p1,p2: max(p1,p2),
((x,i) for i,x in enumerate(yourList))
)
Điều quan trọng cần chú ý về reduce
là loại. * Khi bạn sử dụng giảm (...) với giá trị hạt giống (được gọi là fold
bằng các ngôn ngữ khác), loại trả về sẽ là loại của hạt giống. * Khi bạn sử dụng reduce
bình thường, nó bỏ qua phần tử hạt giống. Điều này làm việc tuyệt vời nếu tất cả các phần tử trong danh sách của bạn cùng loại (ví dụ, bạn có thể reduce(operator.mul, [1,2,3])
hoặc reduce(operator.add, [1,2,3])
tốt, vì loại đầu ra giảm (int) giống với loại đầu vào chưa được tạo (hai int)). Tuy nhiên loại trả về sẽ giống với loại phần tử của danh sách.
Nếu các phần tử của bạn có nhiều loại khác nhau, bạn cần phải sử dụng hàm reduce (...) trong fold
-mode (tức là với hạt giống với ngữ nghĩa phù hợp). (Cách khác là trường hợp đặc biệt lambda của bạn (rất xấu xí).)
Rõ ràng hơn, kiểu trả về dự định của bạn là một bộ (phần tử tối đa và chỉ mục của nó hoặc ngược lại). Tuy nhiên chức năng giảm của bạn là loại tuple,tuple -> int
. Điều này không thể làm việc vì nó vi phạm hợp đồng làm giảm nhu cầu của chức năng của bạn.
Tôi vô tình bỏ phiếu để đóng bản sao. Nó không phải là một bản sao, mặc dù. –