Есть ли способ вычесть число из каждого числа в списке выше другого числа в python? - PullRequest
2 голосов
/ 05 марта 2020

Я очень плохо знаком с python, так что, надеюсь, это будет простой вопрос. У меня есть список с кучей чисел, которые я хотел бы вычесть из числа, если это число выше определенного другого числа. Например, у меня есть следующий список с пропущенными 4:

a = [1, 2, 3, 5, 6, 7, 8, 9]

Что я могу сделать, чтобы уменьшить каждое число больше 4 на единицу? Я пробовал для l oop:

for x in a:
    if x > 4:
        x-=1
print(a)

Но это ничего не меняет в списке. Я также пробовал списки, но я новичок в них, поэтому не смог заставить их работать и получил ошибки:

a = [[x - 1 if x > 4] for x in a]
a = [[x - 1 for x in a] if x > 4]

Что я могу сделать, чтобы уменьшить каждое число выше 4 на единицу и составить этот список считать от одного до восьми?

Ответы [ 4 ]

3 голосов
/ 05 марта 2020

Вы можете попробовать это.

a = [1, 2, 3, 5, 6, 7, 8, 9]
[i-1 if i>4 else i for i in a]
# [1, 2, 3, 4, 5, 6, 7, 8]
2 голосов
/ 05 марта 2020

Ваша первая попытка:

>>> 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]]
2 голосов
/ 05 марта 2020
[x - 1 if x>4 else x for x in a]
2 голосов
/ 05 марта 2020

Вы можете использовать enumerate для генерации индексов для элементов в списке для итерации, чтобы вы могли изменить значение элемента по его индексу:

for i, x in enumerate(a):
    if x > 4:
        a[i] -= 1
...