【问题标题】:Updating list elements by indices [duplicate]按索引更新列表元素[重复]
【发布时间】:2017-12-24 07:17:13
【问题描述】:

我想使用列表理解将 5 添加到我的特定列表索引

输入

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

输出

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

我试过了

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

但它给出了一个错误。

【问题讨论】:

  • 那么有效的方法是什么?
  • @Rotten 我的意思是,列表理解可以更新另一个列表,但它可能不应该
  • for i in range(2,5): a[i] += 5
  • 为什么不简单的 for 循环?
  • @ShashiTunga 不,它不是“与循环相比效率很高”,它略微更快,但它不应该与副作用一起使用。它用于创建新列表

标签: python list list-comprehension


【解决方案1】:

不要对副作用使用列表推导。列表组合的目的是创建一个新列表。为此,我相信你可以在这里使用enumerate + range -

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]

在python3中,这应该非常有效,因为in检查range对象是O(1)时间。在 python2 上,执行布尔检查会更快(这是在 python3 中 in 检查 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. 您在原地进行更改,而不是创建新的list

【讨论】:

  • 答案越来越标准。这是 SO 所期望的答案。
  • x + 5 if lo &lt;= i &lt;= hi else x... 应该比i in range... 快
  • @f5r5e5d 在 python2 上,是的。在python3上,真的没什么区别。
  • 不,lo &lt;= i &lt;= hi 在我的机器上快 4 倍,python 3.6 - 虽然两者都是 O(1)
  • @f5r5e5d 很有趣。这可能是因为每次进行评估时都会创建一个range 对象。由于这是一个循环不变量,因此将其从循环中取出可能会提高其速度。
【解决方案2】:

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

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

[0, 0, 5, 5, 5]

【讨论】:

    【解决方案3】:

    您也可以尝试不使用 for 循环,如下所示:

    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]
    

    【讨论】:

      【解决方案4】:

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

      >>> 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])
      

      【讨论】:

        猜你喜欢
        • 2018-07-01
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-01
        • 2019-12-31
        • 1970-01-01
        相关资源
        最近更新 更多