我有一个嵌套列表,想要找到索引[1]
中项目的最大值。
这是我的清单:
myList = [['apple',2],
['banana',4],
['orange'],
['strawberry',10],
['mango']]
我使用了这个功能:
print(max(myList, key=lambda x: x[1]))
但是它给了我一个错误,因为某些列表中没有索引[1]
中的项目。
由于我的原始数据集非常大,因此使用高效函数检查索引[1]
是否在myList
中然后找到最大值
有没有一种有效的方法?像内置功能?如果可能的话,不要使用for循环。
答案 0 :(得分:3)
如果不存在,您可以使用ternary operator提供默认值,如:
max(myList, key=lambda x: x[1] if len(x) > 1 else 0)
['strawberry', 10]
答案 1 :(得分:3)
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
....
+ operator.itemgetter
为了获得更好的性能,请在调用max
之前尝试预过滤。然后,您可以使用以C速度运行的max
。
operator.itemgetter
这应该适用于数字数据和日期(假设格式是一致的),因为按字典顺序比较日期会很好。
>>> from operator import itemgetter
>>> max((i for i in lst if len(i) > 1), key=itemgetter(1))
['strawberry', 10]
+ zip_longest
另一个有用的选项,如果您安装了NumPy。
np.argmax
免责声明,此仅适用于数字数据。
>>> import numpy as np
>>> from itertools import zip_longest
>>> _, y = itertools.zip_longest(*lst, fillvalue=-float('inf'))
>>> lst[np.argmax(y)]
['strawberry', 10]
如果您能负担得起内存,请在选项1的已分类版本上调用lst = lst * 100000
%timeit max(lst, key=lambda x: x[1] if len(x) > 1 else 0)
175 ms ± 1.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit max((i for i in lst if len(i) > 1), key=itemgetter(-1))
142 ms ± 875 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
_, y = itertools.zip_longest(*lst, fillvalue=-float('inf'))
lst[np.argmax(y)]
136 ms ± 735 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
:
max
到目前为止,这似乎是最具性能的选择。
答案 2 :(得分:2)
如果您想要最大值:
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
答案 3 :(得分:1)
以上答案表示赞赏。
@Mahsa ,您还可以使用列表理解,地图(),过滤器从列表中获取最大数量的水果)和 reduce()如下:
很高兴使用 map(), filter(), reduce()和列表理解 Pythonic程序。
注意:如果列表很大,map(),filter(),reduce()比它们的循环替代品慢。
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