【问题标题】:Finding min()/max() of a 'large' list in python. ValueError: min() arg is an empty sequence在 python 中查找“大”列表的 min()/max()。 ValueError: min() arg 是一个空序列
【发布时间】:2014-09-27 23:20:53
【问题描述】:

我有一个列表列表,例如 E[ ][ ],其中 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 个元素的小型列表。但显示大数据集存在问题。

我该怎么办?

【问题讨论】:

  • 请您提供E 的样品日期吗?
  • 为什么不只是min(min(e) for e in E if e)?你真的不需要索引i,这将跳过空的子列表(如果所有子列表都是空的,你只会得到一个错误,在这种情况下min有反正没有意义)。
  • 内置函数不会因为您提供大量数据而神秘地中断。其中一个min 调用将一个空序列作为参数,您只需筛选大型数据集并找到它。我们无法为您提供帮助。
  • @jonrsharpe 嘿,成功了!你能解释一下为什么这行得通,为什么我的行不通吗?
  • @delnan 我猜,它只是遇到了一个空序列呢?好的。我会找那个。

标签: python list max min large-data


【解决方案1】:

您的代码:

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 件并不多,你可能不需要太担心效率。

【讨论】:

    【解决方案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
    

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

    【讨论】:

    • 谢谢,我不知道“子列表”这个东西。不过,@jonrsharpe 给出的答案也是正确的。使用“子列表”是否使它成为一个复杂的解决方案?或者可能更慢?或者您想详细说明您的答案与 min(min(e) for e in E if e) 之间的区别?
    • @HobbitEesmereldatGoldworthy:我会添加一个timeit 比较;在这里很难说哪一个会更快,因为这取决于子列表的数量和这些子列表中元素的平均数量。
    • 好的。不管怎么说,还是要谢谢你。 :)
    • @HobbitEesmereldatGoldworthy:我因为别的事情被叫走了;对于您的用例,使用嵌套的 min() 调用(如 jonrsharpe 所做的那样)在这里更快,因为这些调用使用 C 循环遍历子列表。
    • @HobbitEesmereldatGoldworthy:你需要很多个小的子列表来使调用另一个函数的成本超过速度增益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2016-07-03
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多