Как вычесть элемент из предыдущего в python? - PullRequest
0 голосов
/ 14 мая 2019

Я делаю сценарий, который дает мне разницу в прибыли, которая представляет собой покупку еще одного элемента в моем бизнесе. У меня есть список с ежемесячным вводом, который я получаю, покупая один, два, три элемента ...

Теперь я хочу узнать разницу в прибыли на фактической итерации относительно предыдущего элемента в списке.

Я пробовал:

for x in my_list:
    x = list[x] - list[x-1]

и некоторые варианты этого, но я получаю ошибку "

индекс списка вне диапазона

"потому что Python не разрешает этого: list [x] в операторе for.

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

Можно сделать это таким образом?

Ответы [ 5 ]

2 голосов
/ 14 мая 2019

Чтобы получить список различий, которые вы можете сделать:

diffs = [y - x for x, y in zip(my_list, my_list[1:])]

При этом используются zip и понимание списка , чтобы позволить вам обрабатывать последующие элементы всписок в более удобной манере.

2 голосов
/ 14 мая 2019

Я не уверен, что полностью понимаю, но вы это имеете в виду?

my_list = [1,2,3,5,7,9]
diff_list = []
for i in range(1,len(my_list)):
    x = my_list[i] - my_list[i-1]
    diff_list.append(x)

print(diff_list)

ВЫХОД:

[1, 1, 2, 2, 2]
1 голос
/ 14 мая 2019

Причина, по которой вы получаете ошибку, заключается в том, что вы неправильно используете цикл for, а x в цикле for - это текущий объект в списке итераций.

например, для списка aList = [3, 5, 2, 5, 8, 12] впервая итерация x будет равна 3, так как aList [0] равен 3

Также, если вы используете свой код с циклом while, он все равно даст нежелательный результат

например

aList = [3, 5, 2, 5, 8, 12]
x = 0
while x < len(aList):
    aList[x] = aList[x] - aList[x-1]
    x += 1

это потому, что aList [x-1] для первой итерации будет ссылаться на последний элемент aList (aList[-1]), начиная с x = 0, так что это будет aList[0] = aList[0] - aList[0-1] или aList[0] = 3 - 12.

Мое решение состояло бы в том, чтобы перечислить список, установить исходное «предыдущее значение» (x_prev) в 0 и вычесть предыдущий элемент из текущего элемента.

aList = [3, 5, 2, 5, 8, 12]
x_prev = 0
for i, x_val in enumerate(aList):
    aList[i] -= x_prev
    x_prev = x_val
print(aList)
0 голосов
/ 14 мая 2019

Это может вам помочь,

my_list = [1,4,6,8,1,16,47]
y = 0
for x in my_list[1:]:
    x1 = x - my_list[y]
    y = y + 1
    print(x1)
0 голосов
/ 14 мая 2019

Во-первых, вы пытаетесь получить доступ к встроенному в Python list в вашем цикле вместо выбранного вами имени переменной my_list.
Во-вторых, вы перезаписываете переменную цикла x внутри цикла - не очень хорошая идея.

Затем, используя for x in my_list:, x уже представляет каждый элемент списка, а не индексы этого списка. Вы можете создать итерацию по индексам списка, например,

for i in range(len(my_list)):

здесь я предоставляю индекс, поэтому здесь my_list[i] имеет смысл.
Лучший подход Python для выполнения этих range of length of... конструкций - enumerate.
Эта функция возвращает счетчик и элементов списка во время итерации, поэтому вы можете написать:

for i, val in enumerate(my_list[1:]):
    x = val - my_list[i]
...