我正在尝试使用python执行以下操作并且有一个奇怪的行为。说我有以下列表:
SomeObject maxObject = someList.stream().max(Comparator.comparing(SomeObject::getValue).get();
现在,我正在做类似的事情:
x = [5, 4, 3, 2, 1]
这给出了:
x[x >= 3] = 3
为什么只有第二个元素被更改?我在期待:
x = [5, 3, 3, 2, 1]
答案 0 :(得分:9)
因为Python会将x>=3
评估为True
,因为True
等于1,所以x
的第二个元素将转换为3.
为此目的,您需要使用列表理解:
>>> [3 if i >=3 else i for i in x]
[3, 3, 3, 2, 1]
如果您想知道为什么x >= 3
评估为True,请参阅以下documentation:
CPython实现细节:除了数字之外的不同类型的对象按其类型名称排序;不支持正确比较的相同类型的对象按其地址排序。
在python-2.x和CPython实现中,列表总是大于整数类型。由于字符串大于列表:
>>> ''>[]
True
但是,在Python-3.X中,您无法将无法排序的类型进行比较,结果会得到TypeError
。
In [17]: '' > []
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-17-052e7eb2f6e9> in <module>()
----> 1 '' > []
TypeError: unorderable types: str() > list()
答案 1 :(得分:4)
您正在使用python列表。在python(2.x)中,list
与int
的比较将比较类型,而不是值。因此,您的比较结果为True
,相当于1
。换句话说,您的表达式等同于:
x[1] = 3 # x[1] == x[True] == x[x > 3]
注意,python3.x不允许这种类型的比较(因为它几乎肯定不是你的意思) - 如果你想做这种操作,你几乎肯定会通过观察它来考虑它numpy
文档,因为numpy API专门用于支持此类事情:
import numpy as np
array = np.arange(5)
array[array > 3] = 3
答案 2 :(得分:4)
您可以将此语法与https://dev.mysql.com/doc/refman/5.5/en/keywords.html:
一起使用>>> import pandas as pd
>>> x = pd.Series([5, 4, 3, 2, 1])
>>> x
0 5
1 4
2 3
3 2
4 1
dtype: int64
>>> x[x>3]=3
>>> x
0 3
1 3
2 3
3 2
4 1
dtype: int64
您也可以使用Numpy:
执行此操作gstat