我是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]