【问题标题】:Python: max() arg is an empty sequencePython:max() arg 是一个空序列
【发布时间】:2021-05-04 16:12:39
【问题描述】:

我想逐个元素地比较元组列表中的一些元组,并打印每次比较的最大值。这是我的代码:

A = [(10, 50, 1), (20, 4, 100), (11, 21, 10), (1, 42, 60), (0, 7, 74)]
indices = [1, 2]
D = (A[i] for i in indices)

for col in range(3):
    print(max(D, key = lambda tpl: tpl[col])[col])

但是输出是:

20
ValueError: max() arg is an empty sequence

如果我通过物化列表D来修改生成器,使得D=[A[i] for i in indices],我得到想要的结果,即:

20
21
100

为什么在以前的实现中会出现该错误?有没有办法在不实现列表的情况下修复它?您对改进代码有什么建议吗?

谢谢

【问题讨论】:

    标签: python lambda filter tuples max


    【解决方案1】:

    这是因为在第一种情况下,D 是一个生成器对象。关于生成器要记住的一点是,在您第一次遍历它们之后,它们会用尽。您不能再次遍历它们。

    所以第一次执行max(D, ...) 时,它会通过生成器计算最大值并打印20。当你第二次尝试同样的事情时,生成器从你第一次经历开始就已经是空的了。

    当您将生成器扩展为具有如下列表理解的列表时,这不是问题:

    D = [ A[i] for i in indices ]
    

    因为您可以根据需要多次遍历列表。

    来自@chepnercomment 的注释如下:

    耗尽是所有迭代器的属性,而不仅仅是生成器。 (您可以多次迭代列表,因为列表是可迭代的,而不是迭代器,每次请求时都会为您提供不同的迭代器。)

    【讨论】:

    • 耗尽是所有迭代器的属性,而不仅仅是生成器。 (您可以多次迭代列表,因为列表是可迭代,而不是迭代器,每次您请求时都会为您提供不同的迭代器。)
    • 你是对的,这是很好的信息。谢谢@chepner!
    【解决方案2】:
    A = [(10, 50, 1), (20, 4, 100), (11, 21, 10), (1, 42, 60), (0, 7, 74)]
    indices = [1, 2]
    
    for i in range(3):
        col=[]
        for index in indices:
            col.append(A[index][i])
        print(max(col))
    

    输出:

    20
    21
    100
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2022-10-14
      • 2018-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多