web-dev-qa-db-ja.com

リストを持つリストから最大値を取得しますか?

だから私はいくつかのリストを含むリストを持っています。すべてのリストには最初に3つの文字列があり、次に1つの浮動小数点数があります:

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

最大値(ここでは9.1931)を返す関数を作成するにはどうすればよいですか?私は試した

def MaxValue():
    max_value = max(resultlist)
    return max_value

しかし、それは私にリストを提供します。

編集:また、値がどこから来るのかのインデックスを取得する方法はありますか?どんなサブリストから?

11
FeatherMarauder

外部リストをループして、各サブリストの最後の要素を選択します。

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

print max_value(resultlist)
# 9.1931

関数に関連するすべての変数をスコープ内に保持することも最適です(リストを引数として渡し、変数名を再利用して名前空間を混同しないでください)。

8
wflynny

おそらくPythonicよりも機能的に:

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

結果リストの各要素を数値にマッピングし、最大値を見つけます。

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

>>> map(lambda x: x[3], resultlist)
[8.3931000000000004, 6.3231000000000002, 9.1930999999999994]
10
Almog
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
3
LetzerWille

インデックスも必要な場合は、enumerateを使用してmapoperator.itemgetterとともに使用できます。

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)

または、通常のgen exp:

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

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

last_indices = [x[3] for x in resultlist]
return max(last_indices)
1
bourbaki4481472

Numpyは、ネストされた数値リストを支援します。これを試して:

_resultlist = [[3, 2, 4, 4], [1, 6, 7, -6], [5, 4, 3, 2]]
max(resultlist)  # yields [5, 4, 3, 2] because 5 is the max in: 3, 1, 5
np.max(resultlist)  # yields 7 because it's the absolute max
_

max()は、最初の要素がすべてのリストの最初の要素の最大値であるリストを返し、np.max()はネストされたすべてのリストから最大値を返します。

1
Guillermo Luijk

番号が常に3番目にあるとは限らないリストのリストを取得する場合の答えを次に示します。

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

何が起こっている? 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

もう1つの一般的な例:

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

編集:

最大値のインデックスも取得したい場合は、次のことができます(@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つの数値があることを前提としています!

数値が任意の位置にあるリストを使用したもう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)
1
Cleb