在python中查找“大”列表的min()/max()。ValueError:min()arg是空序列

2024-05-09 03:22:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个列表,比如E[][],其中E有10个子列表,每个子列表有大约500个条目。

我主要关心的是计算所有5000个值中的最大值,这些值分布在10个子列表中。

我写的是:

MinVal = min(min(E[i]) for i in range(len(E)))

它给了我这个错误:ValueError:min()arg是一个空序列

现在我写下:

min_arr = []
for i in range(len(E)):
    min_arr.append(min(E[i]))
MinVal = min(min_arr)

它给了我同样的错误:ValueError:min()arg是一个空序列

所以,我试着这样做:

print(max(E[1]))

它确实给了我答案

前两个代码也适用于5-10个小元素列表。但是显示了一个大数据集的问题。

我该怎么办?


Tags: in列表forlen错误arg条目range
2条回答

要使用生成器表达式通过嵌套循环展平列表:

MinVal = min(i for sublist in E for i in sublist)

您的错误表示至少有一个子列表是空的,但是上面的子列表自然会跳过这样的空子列表。

如果需要同时确定最小值和最大值,请不要使用两个循环。使用一个循环并“手动”跟踪最小值和最大值:

minimum = float('inf')
maximum = float('-inf')
for sublist in E:
    for i in sublist:
        if i < minimum:
            minimum = i
        if i > maximum
            maximum = i

这样可以确保只在大量值上循环一次。

您的代码:

MinVal = min(min(E[i]) for i in range(len(E)))

E[i] == []时失败,因为没有空集最小值的合理定义。因此,您需要跳过空的子列表。一种选择是:

min_val = min(min(e) for e in E if e)

大致相当于:

min_vals = []
for e in E:
    if e: # or 'if e != []:' - empty sequences evaluate False-y
        mins.append(min(e))
min_val = min(min_vals)

(注意,实际上您没有在任何地方使用索引i,因此可以直接在E上迭代。)

5000件不是那么多,你可能不需要太担心效率。

相关问题 更多 >

    热门问题