Ваша первая попытка:
>>> a = [1, 2, 3, 5, 6, 7, 8, 9]
>>> for x in a:
... if x > 4:
... x -= 1
Неудачи (как вы сказали):
>>> a
[1, 2, 3, 5, 6, 7, 8, 9]
Это потому, что вы имеете дело с целыми числами, а в Python целые числа являются неизменяемыми объектами (плавает, строки, ... неизменны). Когда вы пишете x -= 1
, x
не изменяется, но создается новый x
, уничтожающий старый:
>>> x = 1
>>> id_bkp = id(x) # store the "id" of x
>>> x -= 1
>>> id(x) == id_bkp # this another x!!
False
Вы не можете изменить элементы списков (они неизменный). Следовательно, вы должны создать новый список:
>>> a = [1, 2, 3, 5, 6, 7, 8, 9]
>>> b = []
>>> for x in a:
... if x > 4:
... b.append(x - 1)
... else:
... b.append(x)
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
Это работает, но вы можете использовать более короткий синтаксис. Понимание списка - это способ создать новый список из существующего списка. Но вы должны преобразовать if/else
из выражения в выражение:
>>> b = []
>>> for x in a:
... b.append(x - 1 if x > 4 else x)
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
А теперь, понимание списка:
>>> b = [x - 1 if x > 4 else x for x in a]
>>> b
[1, 2, 3, 4, 5, 6, 7, 8]
Обратите внимание, что если у вас есть список списков, вы получите другой результат, потому что списки изменчивы:
>>> b = [[1], [2], [3], [5], [6], [7], [8], [9]]
>>> for y in b: # y is a singleton list
... if y[0] > 4:
... y[0] -= 1
>>> b
[[1], [2], [3], [4], [5], [6], [7], [8]]