my_list = [0, 219, 211, 212, 212]
我需要以这种方式对项目进行总结:
item + item,(item + item)+ item,(item + item + item)+ Item ...
0 + 219,(219)+211,(430)+212,(641)+212
为了更清楚,这是我需要得到的总和:
new_list = [219, 430, 641, 853]
我认为解决方案可能是列表理解,这样的事情只会返回每个项目与下一个项目的总和。
[(x + y) for (x, y) in zip(my_list[:-1], my_list[1:])]
任何想法?
答案 0 :(得分:6)
您可以从Python 3中复制itertools.accumulate()
documentation description:
import operator
def accumulate(iterable, func=operator.add):
'Return running totals'
# accumulate([1,2,3,4,5]) --> 1 3 6 10 15
# accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120
it = iter(iterable)
try:
total = next(it)
except StopIteration:
return
yield total
for element in it:
total = func(total, element)
yield total
这将汇总输入列表中的值,产生一个运行总计:
>>> my_list = [0, 219, 211, 212, 212]
>>> list(accumulate(my_list))
[0, 219, 430, 642, 854]
您可以根据具体情况定制模式,移除func
自定义点并忽略第一个总数:
def accumulate(iterable):
it = iter(iterable)
try:
total = next(it)
except StopIteration:
return
for element in it:
total += element
yield total
现在它为4个输入产生3个值:
>>> list(accumulate(my_list))
[219, 430, 642, 854]
答案 1 :(得分:1)
......或类似的东西可能
b=0
b = [sum(a[:k]) for k in range(1+len(a))]
对于大型列表可能不会过于高效。
这个测试:
a = [7, 11, 24, 38]
b=0
b = [sum(a[:k]) for k in range(1+len(a))]
print(a)
print(b)
得到:
>>> ================================ RESTART ================================
>>>
[7, 11, 24, 38]
[0, 7, 18, 42, 80]
>>>
或者做Martijn建议并使用itertools。
[顺便说一句 - '去找一个要导入的库'的Python文化是否会破坏编码艺术?]