按索引更新列表元素

时间:2017-12-24 07:17:14

标签: python list list-comprehension

我想使用list comprehension

为我的特定列表索引添加5

输入

arr=[0,0,0,0,0]

输出

arr=[0,0,5,5,5]

我试过

[arr[i]+=5 for i in range(2,4)]

但它会出错。

4 个答案:

答案 0 :(得分:6)

不要使用列表推导来解决副作用。 list comp的目的是创建一个新列表。为此,我相信您可以在此使用sizeof + enumerate -

range

在python3中,这应该非常有效,因为l, u = 2, 4 arr = [x + 5 if i in range(l, u + 1) else x for i, x in enumerate(arr)] print(arr) [0, 0, 5, 5, 5] 对象的in检查时间是range。在python2上,执行布尔检查会更快(这是O(1)检查in在python3中的作用) -

range

但是,请记住arr = [x + 5 if l <= i <= u else x for i, x in enumerate(arr)] 循环是最有效的方法。

for

因为,

  1. 您只需迭代所需的索引。没什么,没有更少
  2. 您可以进行更改,而不是创建新的for i in range(l, u + 1): arr[i] += 5 print(arr) [0, 0, 5, 5, 5]

答案 1 :(得分:2)

您还可以通过在此处切片来添加列表:

arr[0:2] + [i+5 for i in arr[2:5]]

[0, 0, 5, 5, 5]

答案 2 :(得分:2)

你也可以尝试不用这样的循环:

list_1=[0,0,0,0,0]
b=list(range(2,5))
list(map(lambda x,y:list_1.__setitem__(x,list_1[x]+5),b,list_1))
print(list_1)

输出:

[0, 0, 5, 5, 5]

答案 3 :(得分:2)

这是使用列表推导来替换某些索引的Pythonic方法。在这种情况下,除了前两个索引之外的每个索引:

>>> arr = [0,0,0,0,0]
>>> arr[2:] = [i + 5 for i in arr[2:]]
>>> arr
[0, 0, 5, 5, 5]

请注意,arr不是数组,而是列表。使用numpy,操作变得更容易:

>>> import numpy as np
>>> arr = np.array([0, 0, 0, 0, 0])
>>> arr
array([0, 0, 0, 0, 0])
>>> arr[2:] += 5
>>> arr
array([0, 0, 5, 5, 5])

如果你有一个索引列表,它也有效:

>>> arr = np.array([0, 0, 0, 0, 0])
>>> arr
array([0, 0, 0, 0, 0])
>>> arr[[2, 3, 4]]
array([0, 0, 0])
>>> arr[[2, 3, 4]] += 5
>>> arr
array([0, 0, 5, 5, 5])