首页 > 解决方案 > 如何对列表中的连续重复项求和?

问题描述

我在网上做一些练习题来申请实习,结果遇到了困难。问题是对相同的连续数字求和。

示例:[1,1,3,4,4,5] ---> [2,3,8,5]

 def sum_consecutive(s):
    p = []
    for i in range(len(s)):
        if s[i] == s[i-1]:
            p.append(s[i] + s[i-1])
            p.remove(s[i])
        elif s[i] != s[i-1]:
            p.append(s[i])
    return p

在 [1,4,4,4,0,4,3,3,1] 上运行上面的代码时,它应该返回 [1,12,0,4,6,1] 而不是返回

在 sum_consecutive(s)

    if s[i] == s[i-1]:
             p.append(s[i] + s[i-1])
             p.remove(s[i]) #This line is the problem
    elif s[i] != s[i-1]:
             p.append(s[i])

错误:

ValueError: list.remove(x): x not in list

标签: pythonpython-3.xlist

解决方案


使用变量来跟踪上次看到的值,如果相同,则将其添加到当前索引中。

def sum_consecutive(s):
    p = s[:1]   # final list
    cur = s[0]  # keep track of last seen value

    for i in s[1:]:  # your exercise: replace this with `range` 
        if i == cur:
            p[-1] += i
        else:
            p.append(i)
            cur = i

    return p

sum_consecutive([1, 4, 4, 4, 0, 4, 3, 3, 1])
# [1, 12, 0, 4, 6, 1]

作为奖励,我们不要忘记存在 stdlib,因此您可以itertools.groupby在一行中使用它来执行此操作。

from itertools import groupby
[sum(g) for _, g in groupby([1, 4, 4, 4, 0, 4, 3, 3, 1])]
# [1, 12, 0, 4, 6, 1]

推荐阅读