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
我想逐个元素地比较元组列表中的一些元组,并打印每个比较的最大值。这是我的代码:
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