不使用枚举替换列表中的所有值?
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]
虽然这确实创建了一个新数组,但可以说它的效率有点低。我想不出更紧凑的方式来遍历列表并就地更改其中的条目。
您可以将 range
与 len
一起使用:
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。
假设我想在列表中找到所有值“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]
虽然这确实创建了一个新数组,但可以说它的效率有点低。我想不出更紧凑的方式来遍历列表并就地更改其中的条目。
您可以将 range
与 len
一起使用:
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。