不使用枚举替换列表中的所有值?

Replace all values in a list without using enumerate?

假设我想在列表中找到所有值“6”并将其替换为值“600”。我可以使用 enumerate() 来完成此操作,但我认为这不是做我想做的事情的好方法。我面临的问题是我需要知道索引才能用新值替换值,因此是 DATA[idx] 。

DATA = [ 2,4,6,8,6,1,2,3,4,6]
      for idx, val in enumerate(DATA):
        if val == 6:
            DATA[idx]=600

但是有没有其他 and/or 更有效的方法来做到这一点?谢谢你的时间。

使用列表理解:

DATA = [2,4,6,8,6,1,2,3,4,6]
DATA = [600 if x == 6 else x for x in DATA]
print(DATA)
>> [2, 4, 600, 8, 600, 1, 2, 3, 4, 600]

编辑:按要求——顺便说一句,我不太确定这是否正是 Python 在后台实现它的方式,但这里有一个简化版本的理解:

>>>> DATA = [600 if x == 6 else x for x in DATA]
DATA2 = []
for x in DATA:
    if x == 6:
        DATA2.append(600)
    else:
        DATA2.append(x)
DATA = DATA2
del(DATA2)

我不确定 "more efficient" 是什么意思。您所能做的就是遍历数组并考虑每个值。您的代码充分做到了这一点。我看不出有什么问题。

我可以想到许多其他方法来做到这一点。列表理解非常紧凑:

   DATA = [600 if i == 6 else i for i in DATA]

虽然这确实创建了一个新数组,但可以说它的效率有点低。我想不出更紧凑的方式来遍历列表并就地更改其中的条目。

您可以将 rangelen 一起使用:

for i in range(len(DATA)):
    if DATA[i] == 6:
        DATA[i] = 600

或分片赋值:

DATA[:] = [600 if item == 6 else item for item in DATA]

enumerate 可能是最好的。

对于您的任务,最好使用 NumPy's boolean mask 通过直观的命令进行非常快速和方便的就地替换

                              data[data == 6] = 600

完整代码:

import numpy as np            # pip install numpy

DATA = [ 2,4,6,8,6,1,2,3,4,6]

data = np.array(DATA)         # converting to a NumPy array
data[data == 6] = 600         # data == 6 is a boolean mask; it is written in [] as an index

print(data)的输出:

 [  2   4 600   8 600   1   2   3   4 600]

注1:

如果您需要将生成的 NumPy 数组转换回 Python 列表,请使用 data = list(data):

[2, 4, 600, 8, 600, 1, 2, 3, 4, 600]

注二:

将名称 DATA(全部大写)用于您稍后要更改的名称会造成混淆 -
见里面的PEP 8 - Style Guide for Python Code and the part Constants