2012-09-17 30 views
6

tôi có một danh sách bằng Python trong đó mỗi phần tử là một tuple như thế này:Max trong một danh sách với hai điều kiện

(attr1, attr2, attr3) 

Tôi muốn tìm các tuple có lớn nhất attr2, nhưng điều đó có attr3 >= 100.

Phương pháp tiếp cận pythonic là gì?

+2

và bạn mong đợi những gì nếu tất cả các giá trị có 'attr3 <100'? 'max()' sẽ tăng một ValueError nếu nó nhận được một chuỗi rỗng. –

Trả lời

13

Bạn phải cả hai bộ lọc và sử dụng một lập luận key để tối đa:

from operator import itemgetter 

max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1)) 

Bộ lọc cũng có thể được thể hiện dưới dạng một biểu thức máy phát điện:

max((t for t in yourlist if t[2] >= 100), key=itemgetter(1)) 

Demo:

>>> yourlist = [(1, 2, 300), (2, 3, 400), (3, 6, 50)] 
>>> max((t for t in yourlist if t[2] >= 100), key=itemgetter(1)) 
(2, 3, 400) 
>>> max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1)) 
(2, 3, 400) 

Lưu ý rằng vì bạn lọc, thật dễ dàng để kết thúc với một danh sách trống để chọn tối đa từ, vì vậy bạn có thể cần phải nắm bắt ValueError s trừ khi bạn cần ngoại lệ đó để truyền bá ngăn xếp cuộc gọi:

try: 
    return max(filter(lambda a: a[2] >= 100, yourlist), key=itemgetter(1)) 
except ValueError: 
    # Return a default 
    return (0, 0, 0) 
+2

có, genex là chi tiết hơn – wim

+1

@wim: 'filter()' phù hợp rất tốt với mẫu hàm 'max()'. Đó là một câu hỏi về hương vị ở đây. –

+0

Tôi nghĩ rằng biểu thức máy phát điện rõ ràng hơn. – Juho

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