2010-11-28 4 views
1

私はネストされたリストを持っています:python - 指定された位置で最大の整数値を持つサブリストを選択しますか?

nested_list = [['a', 3], ['a', 1], ['a', 5]] 

どのようにこのリストを反復し、最大整数値を持つサブリストを選択しますか?

holder = [] 

for entry in nested_list: 
    tmp = sublist with max entry[2] value 
    holder.append(tmp) 

2行目のコーディングが止まっています。

どんな助力も大歓迎です。

答えて

8

試してみてください。

max(nested_list, key=lambda x: x[1]) 

または

import operator 

max(nested_list, key=operator.itemgetter(1)) 

最初の項目は常に'a'になります場合は、一部に飛び込むために喜んでいる場合は、あなただけの

max(nested_list) 

を行うことができますあなたは任意のサブリストに対してこれをしたいと思っています(1つのレベルだけです。[12 、 'a'、12、42、 'b'])、あなたは何かのようにすることができます。いずれの場合においても

import numbers 

max(nested_list, key=lambda x: max(i for i in x 
            if isinstance(i, numbers.Integral))) 

あなたがnested_listの要素は、実際のリストにあることをわからない場合、あなたは

import collections 

max((s for s in nested_list 
    if isinstance(s, collections.Sequence)), 
    key=some_key_function) 

を行うと、ちょうどそれを独自の工夫や1のキー機能を渡すことができますこの答えで他のものの

lambda x: x[1]operator.itemgetter(1)の質問では、私はプロファイルします。原理的には、itemgetterは正しい方法でなければなりませんが、operatorのソリューションは、ラムダ関数のパフォーマンスが「バグ」(私はこの用語をゆるやかに使用し、コードはまだ動作します)のパフォーマンスがoperatorであることがわかりました。パフォーマンスが問題ではない場合(そしておそらくそうであれば)、私の好みはitemgetterですが、余分なものを避けたい人もいます。import

+1

私はあなたのソリューションを把握するために私のpythonの本に頼らなければなりませんでした。だから、今私は解決策を持っているだけでなく、もう少しPythonを理解しています。ありがとう! –

1

これは適切ですか?

biggest = nested_list[0] 

for entry in nested_list: 
    if entry[1] > biggest[1]: 
     biggest = entry 
+1

Pythonでこのようなコードを書く理由はありません。 –

+0

@Ignacio Vazquez-Abrams、手入れを凝らすには? max(...)のバージョンはもう少しエレガントですが、OPは新しい言語の人のようですが、ループについて理解する前にラムダ式に潜んでいるとは思いません。 – xscott

1

リストは、あなたが提案するほど単純である場合:

>>> nested_list = [['a', 3], ['a', 1], ['a', 5], ['a',2]] 
>>> k = sorted(nested_list) 
>>> k[-1] 
['a', 5] 
>>> 
+0

内側のリストの最初の位置が同じ値である場合は、必ず。そうでなければ、いいえ。 –

+0

@Ignacio Vazquez-Abrams:はい、これは非常に単純な答えです。ソリューションは、入力の範囲に基づいて複雑になることがあります。 :) – pyfunc