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

时间:2018-05-29 00:11:13

标签: 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中然后找到最大值

非常重要。

有没有一种有效的方法?像内置功能?如果可能的话,不要使用for循环。

4 个答案:

答案 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()比它们的循环替代品慢。

»使用map(),lamda函数:

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

»使用filter(),reduce():

# 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