2012-09-17 56 views
6

我有在Python列表中的列表,其中每個元素都是一個元組這樣的:Max在兩個條件

(attr1, attr2, attr3) 

我想找到具有最大attr2元組,但有attr3 >= 100

這是什麼pythonic方法?

+2

和你所期望的輸出,如果所有值都具有'attr3 <100'?如果接收到一個空序列,max()會引發一個ValueError。 –

回答

13

你有兩個過濾器,用key參數最大值:

from operator import itemgetter 

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

過濾器也可以表示爲一個生成器表達式:

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

演示:

>>> 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) 

請注意,由於您過濾了,很容易以空列表結束以從中選取最大值,所以您可能需要搭上ValueError小號,除非你需要異常沿着調用堆棧:

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

是的,genex更pythonic – wim

+1

@wim:'filter()'非常適合'max()'函數模式。這是一個品味問題。 –

+0

我認爲生成器的表達更清晰。 – Juho