我正在尝试对值进行比较,其中y
是值列表。
if max(y) > 1 or max(y) == 1:
ydel = 0.5
elif max(y) < 1:
ydel = 0.005
运行时,上面代码的第一行会产生错误。
>> TypeError: unorderable types: generator() > int()
由于max()显然是一个动态生成对象的内置生成器,我想我应该将值存储在一个名为peak
的变量中。
peak = max(y)
if peak > 1:
ydel = 0.5
else:
ydel = 0.005
运行此操作会产生与以前相同的错误。所以,我试过
peak = float(max(y))
if peak > 1:
ydel = 0.5
else:
ydel = 0.005
但float
也是一个生成器对象(就像int
);这会产生错误
>> TypeError: float() argument must be a string or a number, not 'generator'
我考虑过定义一个返回包含生成器对象的变量的函数,但我认为它不会起作用,因为在变量peak
中存储生成器对象不起作用。我还考虑过试图迭代地找到最大值但是在我的情况下这是很昂贵的,因为我正在考虑多个分布,每个分布由数千个数据点组成,每个分布都需要优化。
有没有办法在没有生成器的情况下非迭代地执行此操作仍然有效?或者也许更好的方法是将生成器值分配给变量以最大化效率?
答案 0 :(得分:3)
max
返回序列中的单个对象。如果它返回一个生成器,则生成器处于该序列中。 Python 3收紧了比较不同内容的规则。因此,如果您尝试将int
与generator
进行比较,则会收到错误消息:
>>> mygen > 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: generator() > int()
同样适用于没有自然顺序的事情
>>> mygen > mygen
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: generator() > generator()
如果序列是单个生成器,则获得生成器。如果它有生成器和其他任何东西,则会出错。
>>> mygen = (i for i in range(3))
>>> max([mygen])
<generator object <genexpr> at 0x7f5a79668240>
>>> max([1,mygen])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unorderable types: generator() > int()
最后,您的问题只有两种可能的解释。要么y
在其中有一个生成器,要么max
被完全不同的函数遮蔽。