Всем элементам после первого положительного отнять 0.5

x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]

b = list(filter(lambda z: z > 0, x))
y = x.index(b[0])
for i in x[y: -1]:
    x[i] -= 0.5
    x[i] += 1
print(x)

Результат:

[-3, -5, 3.5, 5.0, -3.5, 2.5, -2, -5.5, 5]

Почему числа как-то странно считает?


Ответы (2 шт):

Автор решения: Danis

потому что у вас в i попадают значение не от y и до len(x), а все значения списка, т.е. вначале 4, потом -4 и т.д. лучше использовать range

также не понятна зачем нужна строка x[i] += 1, её можно убрать

необязательно получать все значения из filter, лучше получить первое с помощью функции next

x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]

b = next(filter(lambda z: z > 0, x))
y = x.index(b)
for i in range(y + 1, len(x)):
    x[i] -= 0.5

print(x)
→ Ссылка
Автор решения: Zhihar
x = [-3, -5, 3, 4, -4, 2, -2, -6, 5]

enabled = False

for i in range(len(x)):
    x[i] -= 0.5 * enabled
    enabled = enabled or x[i] > 0

print(x)

алгоритм:

  1. проходим по всем элементам массива

  2. у каждого элемента вычитаем 0.5 * enabled, если enabled = False, то соответственно ничего вычитаться не будет (0.5 * 0) иначе будет вычтено 0.5 (0.5 * 1)

  3. если x[i] > 0, то устанавливаем enabled в True, но чтобы сделать это в одну строку требуется выполнить более сложную проверку:

если enabled == True ничего не меняем при любом значении элемента иначе если x[i] > 0 устанавливаем в True

такую проверку можно записать как

enabled = enabled or x[i] > 0

т.е. если enabled True, то его значение не изменится иначе будет установлено по условию

  1. вычисление enabled после вычисления x[i] позволяет менять элементы ПОСЛЕ первого положительного, а не НАЧИНАЯ С первого положительного
→ Ссылка