Как суммировать все соседние ненулевые значения в середине списка в Python - PullRequest
2 голосов
/ 18 апреля 2019

Я новичок в Python. Мне нужно решить проблему с суммированием соседнего ненулевого значения в списке.

Скажи, у меня есть список с именем

a = [2, 3, 0, 0, 1, 0, 3, 3, 1, 0, 0]. 

В a будет несколько случаев, когда элементы отличны от нуля. Например, 2 и 3 соседствуют, поэтому я хочу подвести их итог, чтобы я получил 5.

Затем, есть другие соседние элементы, которые являются 3, 3 и 1. Это - то, где я сталкиваюсь с проблемой, потому что я хочу суммировать ее до 7.

Но в коде, который я пытался сделать, он все равно выводит 4, что является суммой a [7] и a [8]. Есть ли способ, которым я могу избежать этого?

c =[]
for i in range(1, len(a)): 
    if a[i-1] != 0:
        if a[i] != 0:
           tot = a[i] + a[i-1]
           c.append(tot)
           if a[i+1] != 0:
               tot = tot + a[i+1]
               c.append(tot)
    else:
        tot = 0;
        continue

Ответы [ 4 ]

6 голосов
/ 18 апреля 2019

Вы можете использовать itertools.groupby и понимание:

>>> import itertools
>>> a = [2, 3, 0, 0, 1, 0, 3, 3, 1, 0, 0]
>>> [sum(v) for k, v in itertools.groupby(a, key=lambda x: x != 0) if k != 0]
[5, 1, 7]
1 голос
/ 18 апреля 2019

Вы также можете использовать простую функцию генератора:

def groups(d):
  _sum = 0
  for i in d:
    if not i:
      if _sum:
        yield _sum
        _sum = 0
    else:
        _sum += i
  if _sum:
    yield _sum

print(list(groups([2, 3, 0, 0, 1, 0, 3, 3, 1, 0, 0])))

Выход:

[5, 1, 7]
0 голосов
/ 18 апреля 2019

Исходный список 'a' равен [<b>2</b>, <b>3</b>, 0, 0, <b>1</b>, 0, <b>3</b>, <b>3</b>, <b>1</b>, 0, 0], где соседние ненулевые элементы в списке 'a' выделены жирным шрифтом.

a = [2, 3, 0, 0, 1, 0, 3, 3, 1, 0, 0]
def fun(a):
    tot =[] # sub-list of list a
    val=0
    for i in a:
        if i==0:
            if val!=0:
                tot.append(val)
                val=0
        else:
            val+=i
    return tot

print(fun(a))
# output [5, 1, 7]
0 голосов
/ 18 апреля 2019

Как я понимаю, вы хотите вычислить суммы последовательных ненулевых элементов.

Как насчет:

#!python3

from typing import List

def solve(arr: List[int]) -> List[int]:
    ret = []
    tmp = []
    for elem in arr+[0]:
        if elem != 0:
            tmp.append(elem)
        else:
            if len(tmp):
                ret.append(sum(tmp))
                tmp = []
    return ret

arr = [2, 3, 0, 0, 1, 0, 3, 3, 1, 0, 0]
assert(solve(arr) == [5, 1, 7])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...