Всем элементам после первого положительного отнять 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 шт):
потому что у вас в 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)
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)
алгоритм:
проходим по всем элементам массива
у каждого элемента вычитаем
0.5 * enabled, еслиenabled = False, то соответственно ничего вычитаться не будет (0.5 * 0) иначе будет вычтено0.5(0.5 * 1)если
x[i] > 0, то устанавливаемenabledвTrue, но чтобы сделать это в одну строку требуется выполнить более сложную проверку:
если enabled == True ничего не меняем при любом значении элемента иначе если x[i] > 0 устанавливаем в True
такую проверку можно записать как
enabled = enabled or x[i] > 0
т.е. если enabled True, то его значение не изменится иначе будет установлено по условию
- вычисление
enabledпосле вычисленияx[i]позволяет менять элементы ПОСЛЕ первого положительного, а не НАЧИНАЯ С первого положительного