在Python中查找“大”列表的最小值(min)/最大值(max)。 值错误:min()参数是一个空序列。

4

我有一个列表 E[][],E 有十个子列表,每个子列表大约有500个条目。

我的主要问题是计算分布在十个子列表中的所有5000个值的最大值。

现在,我写的代码如下:

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

我遇到了一个错误:ValueError: min()的参数为空序列

现在我写了这个:

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

我尝试了同样的方法,但是出现了相同的错误:ValueError: min()函数的参数序列为空

因此,我尝试进行以下操作:

print(max(E[1]))

并且它确实给了我答案

前两个代码也适用于小型的5-10个元素列表。但在处理大型数据集时会出现问题。

我应该怎么办?


1
请问您能否提供“E”的示例日期? - Nilesh
1
为什么不直接使用 min(min(e) for e in E if e) 呢?你并不需要索引 i,这样可以跳过空的子列表(只有当所有子列表都为空时才会出错,此时 min 也没有意义)。 - jonrsharpe
内置函数不会因为你给它们大量数据而神秘地崩溃。其中一个 min 调用将空序列作为参数,你只需要筛选你的大数据集并找到它。我们无法帮助你解决这个问题。 - user395760
@delnan 我猜它只是遇到了一个空序列?好的,我会去找一下。 - complextea
@HobbitEesmereldatGoldworthy,你说的“有什么区别”是什么意思?它们在执行任务时略有不同。我会让你自己尝试并发现更多! - jonrsharpe
显示剩余4条评论
2个回答

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)
< p > < em > (注意你实际上并没有使用索引i,所以你可以直接遍历E。)

5000个条目并不算太多,您可能不需要过于担心效率。


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

这样可以确保您只需要对大量值进行一次循环。

谢谢,我不知道 'sublist' 这个东西。但是,@jonrsharpe 给出的答案也是正确的。使用 'sublist' 会使它变得复杂吗?或者更慢?还是您想详细说明一下您的答案与 min(min(e) for e in E if e) 之间的区别? - complextea
@HobbitEesmereldatGoldworthy:我会添加一个timeit比较;很难说哪个更快,因为这取决于子列表的数量和这些子列表中元素的平均数量。 - Martijn Pieters
好的,无论如何还是谢谢你。 :) - complextea
@HobbitEesmereldatGoldworthy:我被另外一件事情叫走了;对于你的用例,像jonrsharpe所做的那样使用嵌套的min()调用在这里更快,因为这些调用可以使用C循环迭代子列表。 - Martijn Pieters
@HobbitEesmereldatGoldworthy:你需要许多小的子列表,才能使调用另一个函数的成本超过速度增益的成本。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接