python - 如何对列表中的连续重复项求和?
问题描述
我在网上做一些练习题来申请实习,结果遇到了困难。问题是对相同的连续数字求和。
示例:[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
解决方案
使用变量来跟踪上次看到的值,如果相同,则将其添加到当前索引中。
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]
推荐阅读
- handlebars.js - BigCommerce 在主页上显示品牌(模板)
- shopping-cart - 如何在 3dcart 中访问追加销售商品的定价水平?
- python - 错误:在 Module.__init__() 调用之前无法分配模块,即使在使用 super(DecoderRNN, self).__init__() 之后也是如此
- ubuntu - OpenNMS 快速安装指南 UBUNTU 初始化 OpenNMS .... 失败
- python - 在 Python 和 Keras 中使用 HDF5 文件的数据生成器
- javascript - 使用 Tildas 的目标 ID
- c++ - C++ 如何转换 std::vector
到 const std::vector ? - node.js - 使用 brew 将节点版本 10.7.0 降级到 10.6.0
- macos - 如何从 NSCollectionView 中拖动项目
- reactjs - Enzyme, Jest, React - 两个相关的输入,一个不改变状态