Cách thành ngữ nhất để đạt được điều gì đó như sau, trong Haskell:
foldl (+) 0 [1,2,3,4,5]
--> 15
Hoặc tương đương của nó trong Ruby:
[1,2,3,4,5].inject(0) {|m,x| m + x}
#> 15
Rõ ràng, Python cung cấp reduce
hàm, là một triển khai của gấp, chính xác như ở trên, tuy nhiên, tôi được biết rằng cách lập trình 'pythonic' là tránh lambda
các thuật ngữ và các hàm bậc cao hơn, ưu tiên danh sách hiểu rõ hơn nếu có thể. Do đó, có cách nào được ưu tiên để gấp một danh sách hoặc cấu trúc giống như danh sách trong Python mà không phải là reduce
hàm, hay là reduce
cách thành ngữ để đạt được điều này?
sum
, bạn có thể muốn cung cấp một số loại ví dụ khác nhau.
sum()
thực sự cung cấp chức năng hạn chế với điều này. sum([[a], [b, c, d], [e, f]], [])
trả về [a, b, c, d, e, f]
chẳng hạn.
+
trên danh sách là một phép toán thời gian tuyến tính cả về thời gian và bộ nhớ, làm cho toàn bộ cuộc gọi là bậc hai. Việc sử dụng list(itertools.chain.from_iterable([a], [b,c,d],[e,f],[]])
là tuyến tính tổng thể - và nếu bạn chỉ cần lặp lại nó một lần, bạn có thể bỏ lệnh gọi đến list
để làm cho nó không đổi về mặt bộ nhớ.
sum
không đủ tốt?