2009-12-09 3 views
18

これを行う良い方法はありますか?リストをソートする必要はありません。指定した属性がもっとも大きいアイテムを検索するだけです。私は可読性を最も重視していますが、1つのアイテムを取得するためのリスト全体をソートするのは少し無駄です。あなたはmax機能を使用することができリストの中で最大のアイテムを得るためのPythonic方法

>>> import operator 
>>> 
>>> a_list = [('Tom', 23), ('Dick', 45), ('Harry', 33)] 
>>> sorted(a_list, key=operator.itemgetter(1), reverse=True)[0] 
('Dick', 45) 

私はかなり冗長にそれを行うことができ...

>>> age = 0 
>>> oldest = None 
>>> for person in a_list: 
...  if person[1] > age: 
...    age = person[1] 
...    oldest = person 
... 
>>> oldest 
('Dick', 45) 

答えて

46
max(a_list, key=operator.itemgetter(1)) 
+0

ニース:この問題を解決するには

は、私はフィルタ機能を使用して、次の回避策を見つけました! – Noah

+1

ああ、素晴らしい!良いpythonは私を幸せにします。 –

7

。 - >値

最大(

MAX(...)

最大(反復可能な[、キー= FUNC]):モジュール__builtin__の組み込み関数maxに

ヘルプa、b、c、... [、key = func]) - > value

1つの反復可能な引数で最大の項目を返します。 2つ以上の引数を指定する場合は、最大の引数を返します。

max_item = max(a_list, key=operator.itemgetter(1)) 
2

max()機能を使用するか、FPスタイルにそれを実行します。

reduce(lambda max, c: max if c <= max else c, [1, 6, 9, 2, 4, 0, 8, 1, 3]) 
5

キーはまた、例えば、ラムダことができます。

people = [("Tom", 33), ("Dick", 55), ("Harry", 44)] 
oldest = max(people, key=lambda p: p[1]) 

何らかの理由で、使用してラムダはitemgetterと比較して、「自分のコード」が仕事をしているように感じます。

class Person(object): 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 

people = [Person("Tom", 33), Person("Dick", 55), Person("Harry", 44)] 
oldest = max(people, key=lambda p: p.age) 
0

一部の人々は、次の解決策を述べた:

max(nameOfList, key=len) 

しかし、この解決策は唯一最大の大きさの最初の連続的な要素を返す私は、あなたがオブジェクトのコレクションを持っている場合、これは特に素敵な感じだと思います。たとえば、リスト["ABC"、 "DCE"]の場合、リストの最初の項目だけが返されます。最大は、オプションのキー引数を持っていたことを知らなかった、

filter((lambda x: len(x)==len(max(nameOfList, key=len))),nameOfList) 
関連する問題