2015-05-16 12 views
6

Tôi hiện có danh sách đối tượng, mỗi đối tượng chứa một thuộc tính nhất định. Tôi muốn lấy phần tử của danh sách với giá trị thuộc tính min. Có cách nào ngắn gọn để làm việc này không?Làm cách nào để lấy tối thiểu/tối đa của danh sách bằng cách sử dụng phím

Các python tương đương sẽ là một cái gì đó như: min(d, key=d.get)

Có một cách để nhận được các yếu tố min/max N?

Trả lời

10
CL-USER 8 > (reduce #'min '((1) (-1) (3)) :key #'first) 
-1 

hoặc

CL-USER 9 > (loop for e in '((1) (-1) (3)) minimize (first e)) 
-1 

Tôi sợ nhận được yếu tố container là khó khăn hơn:

CL-USER 9 > (defun minimum (list predicate key) 
       (when list 
       (let* ((m0 (first list)) 
         (m1 (funcall key m0))) 
        (mapc (lambda (e0 &aux (e1 (funcall key e0))) 
          (when (funcall predicate e1 m1) 
          (psetf m0 e0 m1 e1))) 
         list) 
        m0))) 
MINIMUM 

CL-USER 10 > (minimum '((a 1) (b -1) (c -2)) #'< #'second) 
(C -2) 

CL-USER 11 > (minimum '((a 1) (b -1)) #'< #'second) 
(B -1) 

CL-USER 12 > (minimum '((a 1)) #'< #'second) 
(A 1) 

CL-USER 13 > (minimum '() #'< #'second) 
NIL 
+0

Điều này dường như trả về phần tử sau khi áp dụng hàm được chỉ định bằng khóa, trả về thuộc tính. Có cách nào để trả lại toàn bộ phần tử không? – user2059807

+0

@ user2059807: xem chỉnh sửa ... –

1

Sử dụng các chức năng được cung cấp bởi thư viện Alexandria: extremum.

(extremum '((a 3) (b 1) (c 2)) #'< :key #'second) 
=> (B 1) 
Các vấn đề liên quan