2015-10-21 3 views
5

だから、のように、その後1つのフロート番号、:リストのリストから最大値を取得しますか?私はすべてが最初の3つの文字列を持っているいくつかのリストを含むリストを持っている

resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]] 

は、どのように私は(ここでは9.1931されるであろう)の最大値を返す関数を作るのですか?試しました

しかし、それは私にリストを与えます。

EDIT:また、値の元の場所のインデックスを取得する方法はありますか?同様に、どのサブリストからですか?

+0

あなたは2番目のインデックスに余分な開口部角括弧を持っています。 – bourbaki4481472

+0

@ bourbaki4481472ああ、申し訳ありませんが、そこにいるはずはありませんでした。それは私の質問を書いたときのちょうど間違いだった、それは私の実際のプログラムではない。 – FeatherMarauder

答えて

4

ループし、各サブリストの最後の要素を選択:

def max_value(inputlist): 
    return max([sublist[-1] for sublist in inputlist]) 

print max_value(resultlist) 
# 9.1931 

をそれはあなたがスコープ内のすべての機能に関連する変数を保持している場合(引数とドンとしてリストを渡すこともお勧めします変数名を再利用して名前空間を混乱させないでください)。

0

あなたは浮動小数点数(リストの最後のインデックス)から最大の数字を取得しようとしていますか?もしそうなら、ここに解決策があります。

あなたの外側のリストを
last_indices = [x[3] for x in resultlist] 
return max(last_indices) 
+0

なぜ 'max()'の代わりに 'sorted()[0]'を使うのですか?これは、最大の価値を得るためだけにリストを並べ替えることで、大きな成果をあげています。 – wflynny

+0

@wflynny実際にあなたのコメントを投稿したので、私は自分の答えを編集しました。 – bourbaki4481472

2
resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]] 
print(max(map(lambda x: x[-1],resultlist))) 

出力:ニシキヘビ方法よりもおそらくより機能において

9.1931 
+0

私は、追加のリストコマンドは必要ないと思います。 – Cleb

+0

@クレブ、そうです、知っておきたい.... – LetzerWille

7

>>> max(map(lambda x: x[3], resultlist)) 
9.1931 

これは数値に結果リストの各要素をマッピングすることによって開始し、次いでmaxは認めます。

中間配列は次のとおりです。

>>> map(lambda x: x[3], resultlist) 
[8.3931000000000004, 6.3231000000000002, 9.1930999999999994] 
2

あなたもインデックスをしたい場合は、mapを使用してoperator.itemgetterenumerateを使用することができます。

インデックスを持つ最大のタプルを返します
from operator import itemgetter 
def max_val(l, i): 
    return max(enumerate(map(itemgetter(i), l)),key=itemgetter(1))) 

In [7]: resultlist = [["1", "1", "a", 8.3931], ["1", "2", "b", 6.3231], ["2", "1", "c", 9.1931]] 

In [8]: max_val(resultlist, -1) 
Out[8]: (2, 9.1931) 

egular GENのEXP:何が起こっているかを

from itertools import chain 
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist))) 

:ここ

from operator import itemgetter 
def max_val(l, i): 
    return max(enumerate(sub[i] for sub in l), key=itemgetter(1)) 
+1

+1 "itemgetter"。しかし、関数 "max_val"の最初の定義に何か問題があると思うが、少なくともSyntaxErrorを受け取る - 私はparanthesesに何か問題があると思う。 – Cleb

+0

@クレブ、はい、歓声、私は余分なparenを持っていました –

+0

あなたはそれを削除できますか - それを編集するには十分な評判がありません! ;) – Cleb

1

あなたは数が3位に常にではありません、リストのリストを取得念の答えは? itertools.chainはリストのリストを一様化し、filterは次にmax関数を使用して最大値が決定されるすべての数値を選択します。 利点は、リスト内の任意の場所で数値が見つかるリストの任意のリストに対しても機能することです。ご例えば

resultlist = [['1', '1', 'a', 8.3931], ['1', '2', 'b', 6.3231], ['2', '1', 'c', 9.1931]] 
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist))) 
#prints 9.1931 

もう一つの一般的な例:

myList = [[23, 34, 'a'],['b'],['t', 100]] 
max(filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList))) 
#prints 100 

はEDIT:

あなたはまた、最大値のインデックスを取得したい場合は、あなたが行うことができます(パドレイクカニンガムアプローチを使って@Padraic Cunninghamアプローチを使用して)次のようになる:

from itertools import chain 
import operator 
resultlist = [['1', '1', 'a', 8.3931], ['1', '2', 'b', 6.3231], ['2', '1', 'c', 9.1931]] 
l = filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(resultlist)) 
# l: [8.3931, 6.3231, 9.1931] 
max(enumerate(l), key = operator.itemgetter(1)) 
#(2, 9.1931) 

この手法では、リストごとに1つの数値が正確に存在することを前提としています。数値は、任意の位置にあるリストを使用して

もう一つの例:

from itertools import chain 
import operator 
myList = [[23, '34', 'a'],['b', 1000],['t', 'xyz', 100]] 
l=filter(lambda x: isinstance(x, (int, long, float)), chain.from_iterable(myList)) 
max(enumerate(l), key = operator.itemgetter(1)) 
#prints (1, 1000) 
関連する問題