【问题标题】:Sum of only given index in a list with an another integer列表中唯一给定索引与另一个整数的总和
【发布时间】:2018-08-17 16:54:01
【问题描述】:

我想对这个列表中的特定索引求和

b = [3,4,6,8,9]
b[2:4] += 100
print(b)

当我尝试执行时,我得到:

b[2:4] += 100
TypeError: 'int' object is not iterable

预期的输出是:

[3,4,106,108,9]

谁能帮我得到我预期的输出?

【问题讨论】:

    标签: python list-manipulation


    【解决方案1】:

    Python 列表不是这样工作的。只需对索引使用循环即可。

    >>> b
    [3, 4, 6, 8, 9]
    >>> for i in range(2, 4):
    ...     b[i] += 100
    ...     
    >>> b
    [3, 4, 106, 108, 9]
    

    或者,使用 numpy 数组,它确实支持该语法:

    >>> import numpy as np
    >>> b = np.array([3, 4, 6, 8, 9])
    >>> b[2:4] += 100
    >>> b
    array([  3,   4, 106, 108,   9])
    

    【讨论】:

      【解决方案2】:

      您希望的是 NumPy 索引。但是,这需要第 3 方 NumPy 库:

      import numpy as np
      
      b = [3,4,6,8,9]
      b = np.array(b)
      b[2:4] += 100
      
      print(b)
      
      array([  3,   4, 106, 108,   9])
      

      在纯 Python 中,您可以使用列表推导式。为了避免重复索引,您可以定义一个slice 对象:

      s = slice(2, 4)
      b[s] = [i+100 for i in b[s]]
      
      print(b)
      
      [3, 4, 106, 108, 9]
      

      【讨论】:

        【解决方案3】:

        首先,我将回答为什么会失败的问题。您正在使用数组b 中的slice。这意味着,

        >>> b = [3, 4, 6, 8, 9]
        >>> b[2:4]
        [6, 8]
        

        然后你说,b[2:4] + 100 相当于[6, 8] + 100,但这对 Python 意味着什么?要将100 附加到列表中吗?是否要将100 添加到第一个元素?第二个?

        你开始看到这里的模棱两可了吗?正如其他人所指出的,这种行为是为 numpy 数组定义的,而不是为 vanilla python 定义的。

        对此有很多解决方案,但 IMO 以下是最清晰的解决方案。

        b = [3, 4, 6, 8, 9]
        for i in range(2, 4):
            b[i] += 100
        

        然而,最 Pythonic 会涉及列表理解,您可以在其他答案中看到,但 IMO 对您来说似乎有点高级。

        【讨论】:

          【解决方案4】:

          使用enumerate 和列表理解

          >>> b=[3,4,6,8,9]
          >>> [e*100 if i in range(2,4) else e for i,e in enumerate(b)]
          [3, 4, 600, 800, 9]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-25
            相关资源
            最近更新 更多