Сумма только указанного индекса в списке с другим целым числом

Я хочу суммировать конкретный индекс в этом списке

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 ответа

Решение

Использование 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]

Списки Python не работают так. Просто используйте цикл над индексами.

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

Или используйте numy массивы, которые точно поддерживают этот синтаксис:

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

То, на что вы надеетесь, это индексирование NumPy. Однако для этого требуется сторонняя библиотека 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]

Сначала я отвечу на вопрос, почему это не удается. Вы принимаете 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

Тем не менее, наиболее питоническим может быть понимание списка, которое вы можете увидеть в других ответах, но IMO, который кажется вам немного продвинутым.

Другие вопросы по тегам