2015-12-19 17 views
7

Thư viện chuẩn Python có hàm trả về giá trị tại chỉ mục 0 không? Nói cách khác:Hàm Python trả về giá trị tại chỉ mục 0?

zeroth = lambda x: x[0] 

Tôi cần sử dụng chức năng này theo thứ tự cao hơn như map(). Tôi hỏi vì tôi tin rằng đó là rõ ràng hơn để sử dụng một chức năng tái sử dụng chứ không phải là định nghĩa một tùy chỉnh một - ví dụ:

pairs = [(0,1), (5,3), ...] 

xcoords = map(funclib.zeroth, pairs) # Reusable 
vs. 
xcoords = map(lambda p: p[0], pairs) # Custom 

xcoords = [0, 5, ...] # (or iterable) 

Tôi cũng hỏi vì Haskell không có một chức năng như vậy Data.List.head, đó là hữu ích như một cuộc tranh cãi để higher- chức năng theo thứ tự:

head :: [a] -> a 
head (x:xs) = x 
head xs = xs !! 0 

xcoords = (map head) pairs 
+0

Không bao giờ yêu cầu một thư viện, nó là off topic. Tôi đã chỉnh sửa các khu vực lỗi. Chăm sóc lần sau. –

+5

Điều gì là sai khi yêu cầu một hàm trong thư viện chuẩn của ngôn ngữ? – Nayuki

+2

Tôi sẽ chỉnh sửa câu hỏi này một chút để phản ánh ý định ban đầu của mình. – Nayuki

Trả lời

6

Bạn cần phải sử dụng operator.itemgetter

>>> import operator 
>>> pairs = [(0,1), (5,3)] 
>>> xcoords = map(operator.itemgetter(0), pairs) 
>>> xcoords 
[0, 5] 

Trong Python3, map trả về một bản đồ đối tượng, do đó bạn cần một cuộc gọi list qua nó.

>>> list(map(operator.itemgetter(0), pairs)) 
[0, 5] 
+0

Câu trả lời hoàn hảo sau 1 phút. Tôi sẽ chấp nhận nó ngay khi bộ đếm thời gian 15 phút hết hạn. – Nayuki

+0

'list (map (operator.itemgetter (0), pairs))' cho python3 –

+2

FWIW, tôi tìm 'lambda p: p [0]' rõ ràng hơn 'operator.itemgetter (0)' –

3

Cách tiếp cận Pythonic nhất có thể sẽ sử dụng operator.itemgetter(0). Nó chỉ trả về một hàm như vậy.

Một cách tiếp cận khác là gọi trực tiếp obj.__getitem__. Đó là ít Pythonic bởi vì nó gọi một cách rõ ràng tên phương thức đặc biệt, thay vì cho phép Python suy ra những gì để gọi nội bộ.

+1

Tôi hiểu 'operator.itemgetter()', nhưng câu trả lời thứ hai 'obj .__ getitem__' giúp giải quyết vấn đề như thế nào? – Nayuki

+0

@NayukiMinase vì đó là một hàm và không chỉ là cú pháp thuần túy, bạn có thể thao tác nó như một hàm bậc cao hơn để giải quyết vấn đề của bạn. – kojiro

0

Với list comprehension:

>>> pairs = [(0,1), (5,3)] 
>>> xcoords = [ t[0] for t in pairs ] 
>>> xcoords 
+2

Câu trả lời này về cơ bản làm nảy sinh vấn đề tôi có. – Nayuki

Các vấn đề liên quan