在Python中查找'大'列表的min()/max(),ValueError: min()参数是一个空序列
我有一个列表,里面包含了十个子列表,叫做 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个项目并不算太多,你可能不需要太担心效率问题。