Расчет списка с элементами не равными нулю - PullRequest
0 голосов
/ 15 января 2020

Предположим, у меня есть список:

list1 = [16620, 22032, 0, 0, 0, 136813, 137899, 0, 199546, 204804]

Я ищу новый список, который вычитает каждое «ненулевое» значение из следующего «ненулевого» значения, например 22032-16620, 137899-136813. Нулевые значения останутся нетронутыми. В дополнение к этому вычтенное «ненулевое» значение должно измениться на ноль. Вывод будет выглядеть примерно так:

list2 = [0, 5412, 0, 0, 0, 0, 1086, 0, 0, 5258]

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

list1 = [0, 0, 0, 0, 95472, 0, 0, 104538, 0, 0, 0, 0, 187649, 0, 0, 204841, 0, 0, 0, 0, 0, 0, 0, 0]

который должен превратиться в:

list2 = [0, 0, 0, 0, 0, 0, 0, 9066, 0, 0, 0, 0, 0, 0, 0, 17192, 0, 0, 0, 0, 0, 0, 0, 0]

Как видите, количество элементов остается одинаковым для list1 и list2. Кроме того, всегда есть четное количество «нулевых» значений и четное количество «ненулевых» значений. Помощь очень ценится!

То, что у меня есть:

from itertools import cycle, chain
list1 = [11545, 15334, 71341, 73861, 0, 0, 170374, 171671]
newlist = [list1[i + 1] - list1[i] for i in range(len(list1)-1)]
list2 = list(chain.from_iterable(zip(newlist[0::2], cycle([int()]))))
print list2

Выходной список печати2 выглядит так, как я себе представляю, но он не будет работать для списка, который выглядит как :

list1 = [16620, 22032, 0, 0, 0, 136813, 137899, 0, 199546, 204804]

1 Ответ

0 голосов
/ 15 января 2020

Скопируйте, но настройте ненулевые значения, следя за предыдущим.

list2 = []
prev = None
for curr in list1:
    if curr:
        if prev:
            curr -= prev
            prev = None
        else:
            prev = curr
            curr = 0
    list2.append(curr)
...