寻找一个“大”的min()/ max()。在python中列出。 ValueError:min()arg是一个空序列

时间:2014-08-05 10:19:29

标签: python list max min large-data

我有一个列表,例如E [] [],其中E有十个子列表,每个子列表大约有500个。

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

现在,我写的是:

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元素列表。但是显示了大数据集的问题。

我该怎么办?

2 个答案:

答案 0 :(得分: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上进行迭代。)

5,000项不是那么多,你可能不需要过多担心效率。

答案 1 :(得分: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

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