我有一个嵌套列表,希望在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/

10-16 19:47