python:用条件替换列表中的元素

时间:2015-09-21 15:59:07

标签: python python-3.x python-2.7 list

我正在尝试使用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]

3 个答案:

答案 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)中,listint的比较将比较类型,而不是值。因此,您的比较结果为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