我想使用list comprehension
为我的特定列表索引添加5输入
arr=[0,0,0,0,0]
输出
arr=[0,0,5,5,5]
我试过
[arr[i]+=5 for i in range(2,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
因为,
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])