Python: max() arg 是一个空序列

Python: max() arg is an empty sequence

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

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

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

谢谢

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

所以你第一次做 max(D, ...) 它会运行生成器来计算最大值并打印 20。第二次尝试同样的事情时,生成器在你第一次尝试时已经是空的了。

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

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

因为您可以随心所欲地遍历列表。

下面来自@chepner's 的注释:

Exhaustion is a property of all iterators, not just generators. (You can iterate over a list multiple times because a list is an iterable, not an iterator, that gives you a different iterator each time you ask for one.)

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