在Python中查找'大'列表的min()/max(),ValueError: min()参数是一个空序列

4 投票
2 回答
9273 浏览
提问于 2025-04-18 16:03

我有一个列表,里面包含了十个子列表,叫做 E[ ][ ],每个子列表大约有500个条目。

我最关心的是计算这十个子列表中所有5000个值的最大值。

我写的代码是这样的:

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

但是它给了我一个错误:ValueError: min() arg is an empty sequence

然后我又写了这个:

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

结果还是出现了同样的错误:ValueError: min() arg is an empty sequence

所以,我尝试了这个:

print(max(E[1]))

结果这次给了我一个答案

前面两个代码在处理小的5到10个元素的列表时也能正常工作,但在处理大数据集时就出现了问题。

我该怎么办呢?

2 个回答

1

你想用生成器表达式来把列表展开,也就是通过嵌套循环来处理:

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

这样可以确保你只对大量的值循环一次。

4

你的代码:

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个项目并不算太多,你可能不需要太担心效率问题。

撰写回答