我有一个嵌套列表,希望在index[1]
中找到项的最大值。
这是我的名单:
myList = [['apple',2],
['banana',4],
['orange'],
['strawberry',10],
['mango']]
我使用了这个函数:
print(max(myList, key=lambda x: x[1]))
但它给了我一个错误,因为有些列表的索引
[1]
中没有项。。
有什么有效的方法吗??。
最佳答案
operator.itemgetter
+max
要获得更好的性能,请在调用max
之前尝试预筛选。。
>>> from operator import itemgetter
>>> max((i for i in lst if len(i) > 1), key=itemgetter(1))
['strawberry', 10]
这应该适用于数字数据以及日期(假设格式化是一致的),因为日期在字典上比较好。
operator.itemgetter
+zip_longest
另一个有用的选项,如果你安装了NumPy。
>>> import numpy as np
>>> from itertools import zip_longest
>>> _, y = itertools.zip_longest(*lst, fillvalue=-float('inf'))
>>> lst[np.argmax(y)]
['strawberry', 10]
。
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)
If you can afford the memory, call
np.argmax
on the listified version of option 1:%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)
这似乎是迄今为止最有效的选择。
关于python - 从大小不均的列表中找到最大的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50574717/