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