Get max value from a list with lists?

2020-02-25 08:34发布

So I have a list that contains several list which all have three strings first, then one float number, like:

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

How do I make a function that returns the maximum value (which here would be 9.1931)? I tried

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

but that just gives me a list.

EDIT: Also, any way I could get the index for where the value comes from? Like, from which sublist?

7条回答
聊天终结者
2楼-- · 2020-02-25 09:26

Here is an answer just in case you get a list of list where the number is not always on the 3rd position:

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

What is going on? itertools.chain flattens the list of lists, the filter then selects all the numeric values of which the maximal value is then determined using the max function. Advantage here is that it also works for arbitrary lists of lists where the numeric value can be found anywhere in the list.

For your example:

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

One more general example:

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

EDIT:

If you also want to get the index of the maximal value, you can do the following (using @Padraic Cunningham approach):

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)

This approach assumes that there is exactly one numeric value per list!

One more example using a list where the numeric value is on an arbitrary position:

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)
查看更多
登录 后发表回答