Python 从大小不均的列表中查找最大项

Python 从大小不均的列表中查找最大项,python,list,nested,max,Python,List,Nested,Max,我有一个嵌套列表,希望在索引[1]中找到项目的最大值 以下是我的清单: myList = [['apple',2], ['banana',4], ['orange'], ['strawberry',10], ['mango']] 我使用了这个函数: print(max(myList, key=lambda x: x[1])) 但是它给了我一个错误,因为一些列表在索引[1]中没有项 因为我的原始数据集非常大,所以

我有一个嵌套列表,希望在索引
[1]
中找到项目的最大值

以下是我的清单:

myList = [['apple',2],
          ['banana',4],
          ['orange'],
          ['strawberry',10],
          ['mango']]
我使用了这个函数:

 print(max(myList, key=lambda x: x[1]))
但是它给了我一个错误,因为一些列表在索引
[1]
中没有项

因为我的原始数据集非常大,所以使用一个有效的函数检查索引
[1]
是否在
myList
中,然后找到最大值对我来说很重要

有没有有效的方法?像一个内置函数?如果可能的话,不想使用for循环。

当不存在时,可以使用提供默认值,如:

max(myList, key=lambda x: x[1] if len(x) > 1 else 0)
结果:
operator.itemgetter
+
max
为了获得更好的性能,请在调用
max
之前尝试预筛选。然后可以使用以C速度运行的
操作符.itemgetter

>>> from operator import itemgetter
>>> max((i for i in lst if len(i) > 1), key=itemgetter(1))
['strawberry', 10]
这应该适用于数字数据和日期(假设格式是一致的),因为在按字典进行比较时,日期表现良好


zip\u最长
+
np.argmax
另一个有用的选项,如果您安装了NumPy

>>> import numpy as np
>>> from itertools import zip_longest
>>> _, y = itertools.zip_longest(*lst, fillvalue=-float('inf'))
>>> lst[np.argmax(y)]
['strawberry', 10]
免责声明,这仅适用于数字数据


如果您有足够的内存,请在选项1的列表版本上调用
max

%timeit max([i for i in lst if len(i) > 1], key=itemgetter(-1))
128 ms ± 976 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

这似乎是迄今为止性能最好的选项。

如果您想要最大的值:

import sys
MIN_INT = -sys.maxsize-1  # Largest negative integer.

myList = [['apple', 2],
          ['banana', 4],
          ['orange'],
          ['strawberry', 10],
          ['mango']]

maximum_value = max(myList, key=lambda item: item[1] if len(item) > 1
                                        else MIN_INT)[1]
print(maximum_value)  # -> 10

以上答案不胜感激

@Mahsa,您还可以使用列表理解映射()过滤器()减少()从列表中获取最大水果数,如下所示:

在Pythonic程序中使用map()filter()reduce()列表理解非常好

注意:map()、filter()、reduce()如果列表很大,则它们的循环速度比它们的循环速度慢

»使用map(),lamda函数: »使用filter(),reduce():
非常感谢。没问题@Masha。喜欢Python。谢谢
%timeit max([i for i in lst if len(i) > 1], key=itemgetter(-1))
128 ms ± 976 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
import sys
MIN_INT = -sys.maxsize-1  # Largest negative integer.

myList = [['apple', 2],
          ['banana', 4],
          ['orange'],
          ['strawberry', 10],
          ['mango']]

maximum_value = max(myList, key=lambda item: item[1] if len(item) > 1
                                        else MIN_INT)[1]
print(maximum_value)  # -> 10
my_list =  [['apple',2],['banana',4],['orange'],['strawberry',10],['mango']];

# Using map() function (1st way)
max_count = max(list(map(lambda item: item[1] if len(item) > 1 else -1, my_list)))
print(max_count) # 10
# Using filter() and reduce()
from functools import reduce

my_list =  [['apple',2],['banana',67],['orange'],['strawberry',10],['mango']];

def get_max(item1, item2):
    if type (item1)  == type([]):
        if item1[1] > item2[1]:
            return item1[1]
    elif item1 > item2[1]:
            return item1
    return item2[1]

filtered_items = list(filter(lambda item: len(item) > 1, my_list))
max_count2 = reduce(get_max, filtered_items)
print(max_count2) # 67