如何在 Python 中汇总列表中间的所有相邻非零值



我是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
您可以使用

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]

您还可以使用简单的生成器函数:

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]

据我了解,您要计算连续非零元素的子和。

怎么样:

#!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])

原始列表"a"是[2, 3, 0, 0, 1, 0, 3, 3, 1, 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]

最新更新