1

我想总结这个列表中的特定索引

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]

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

4

4 回答 4

2

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])
于 2018-08-17T16:59:17.610 回答
1

您希望的是 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]
于 2018-08-17T17:01:34.180 回答
1

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

>>> 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 对您来说似乎有点先进。

于 2018-08-17T17:10:30.503 回答
0

使用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]
于 2018-08-17T16:57:58.773 回答