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

时间:2019-02-09 23:57:07

标签: python python-3.x loops for-loop enumerator

说我想在列表中找到所有值'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

但是有替代的和/或更有效的方法吗?谢谢您的宝贵时间。

4 个答案:

答案 0 :(得分:2)

我不确定“提高效率”是什么意思。您所能做的就是遍历数组并考虑每个值。您的代码可以充分做到这一点。我看不出有问题。

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

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

这确实会创建一个新数组,因此可以说效率较低。我想不出一种更紧凑的方式来遍历列表并在其中更改条目。

答案 1 :(得分:1)

使用列表理解:

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)

答案 2 :(得分:0)

您可以将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可能是最好的。

答案 3 :(得分:0)

对于您的任务,最好使用NumPyboolean 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]

注释2:

将名称DATA(全部大写)用于以后将要更改的内容会造成混淆-
参见PEP 8 - Style Guide for Python Code和其中的部分Constants