在python列表的第7个元素后插入前7个元素的总和

在python列表的第7个元素后插入前7个元素的总和,python,python-2.7,Python,Python 2.7,我想在第7个元素之后插入前7个元素的和,在另外7个元素之后插入下7个元素的和,诸如此类 a1_tr = [21.1, 10.5, 6.31, 21.1, 6.31, 6.3, 10.4, 17.1, 7.61, 17.2, 7.6, 15.4, 8.54, 8.53, 21.1, 9.47, 7.01, 9.47, 7.01, 6.98, 21.1, 8.34, 16.7, 16.7, 8.34, 15.3, 8.28, 8.39, 9.83, 20.4, 6.77, 6.78, 21.8, 9

我想在第7个元素之后插入前7个元素的和,在另外7个元素之后插入下7个元素的和,诸如此类

a1_tr = [21.1, 10.5, 6.31, 21.1, 6.31, 6.3, 10.4, 17.1, 7.61, 17.2, 7.6, 15.4, 8.54, 8.53, 21.1, 9.47, 7.01, 9.47, 7.01, 6.98, 21.1, 8.34, 16.7, 16.7, 8.34, 15.3, 8.28, 8.39, 9.83, 20.4, 6.77, 6.78, 21.8, 9.69, 6.78, 7.73, 16.7, 8.33, 8.34, 7.74, 16.7, 16.7, 8.2, 16.5, 8.23, 16.4, 8.18, 8.2, 16.5, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1]
len(a1_tr) = 56
我想在此列表中添加8个元素,使其长度为64

这是元素列表,其中包含上述列表中的7个元素:

trsumlist = [82.02000000000001, 81.97999999999999, 82.13999999999999, 82.05, 82.05, 82.24, 82.21, 147.7]
以下是我尝试过的:

i = 1
x = 0
>>> while i <= len(a1_tr):
     a1_tr.insert(i, trsumlist[x])
     x = x+1
     i += 8

>>> a1_tr
[21.1, 10.5, 6.31, 21.1, 6.31, 6.3, 10.4, 17.1, 7.61, 17.2, 7.6, 15.4, 8.54, 8.53, 21.1, 9.47, 7.01, 9.47, 7.01, 6.98, 21.1, 8.34, 16.7, 16.7, 8.34, 15.3, 8.28, 8.39, 9.83, 20.4, 6.77, 6.78, 21.8, 9.69, 6.78, 7.73, 16.7, 8.33, 8.34, 7.74, 16.7, 16.7, 8.2, 16.5, 8.23, 16.4, 8.18, 8.2, 16.5, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1]

>>> len(a1_tr)
56
i=1
x=0
>>>而我>>a1\u tr
[21.1, 10.5, 6.31, 21.1, 6.31, 6.3, 10.4, 17.1, 7.61, 17.2, 7.6, 15.4, 8.54, 8.53, 21.1, 9.47, 7.01, 9.47, 7.01, 6.98, 21.1, 8.34, 16.7, 16.7, 8.34, 15.3, 8.28, 8.39, 9.83, 20.4, 6.77, 6.78, 21.8, 9.69, 6.78, 7.73, 16.7, 8.33, 8.34, 7.74, 16.7, 16.7, 8.2, 16.5, 8.23, 16.4, 8.18, 8.2, 16.5, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1, 21.1]
>>>len(a1_tr)
56

这不是在第7个元素之后插入任何元素,有人能给我建议其他方法来实现这一点吗?

最明显的方法是迭代列表,并保持一个运行总数。然后,在每七个元素之后,加上总数

a1_tr = [21.1, 10.5, 6.31, 21.1, 6.31, 6.3, 10.4, 17.1, 7.61, 17.2, 7.6, 15.4, 8.54, 8.53, 21.1, 9.47, 7.01, 9.47,
         7.01, 6.98, 21.1, 8.34, 16.7, 16.7, 8.34, 15.3, 8.28, 8.39, 9.83, 20.4, 6.77, 6.78, 21.8, 9.69, 6.78, 7.73,
         16.7, 8.33, 8.34, 7.74, 16.7, 16.7, 8.2, 16.5, 8.23, 16.4, 8.18, 8.2, 16.5, 21.1, 21.1, 21.1, 21.1, 21.1,
         21.1, 21.1]

idx = 0
sum_ = 0
new = list()
for element in a1_tr:
    idx += 1
    sum_ += element
    new.append(element)
    if idx == 7:
        new.append(sum_)
        sum_ = 0
        idx = 0

print(new)
更简洁地说:

a1_tr = [21.1, 10.5, 6.31, 21.1, 6.31, 6.3, 10.4, 17.1, 7.61, 17.2, 7.6, 15.4, 8.54, 8.53, 21.1, 9.47, 7.01, 9.47,
         7.01, 6.98, 21.1, 8.34, 16.7, 16.7, 8.34, 15.3, 8.28, 8.39, 9.83, 20.4, 6.77, 6.78, 21.8, 9.69, 6.78, 7.73,
         16.7, 8.33, 8.34, 7.74, 16.7, 16.7, 8.2, 16.5, 8.23, 16.4, 8.18, 8.2, 16.5, 21.1, 21.1, 21.1, 21.1, 21.1,
         21.1, 21.1]

n = 7
chunks = [a1_tr[idx:idx+n] + [sum(a1_tr[idx:idx+n])] for idx in range(0, len(a1_tr), n)]
new = [x for y in chunks for x in y]
print(new)

您可以将项目分组为七,然后使用
map
lambda
中追加
sum

it = iter(a1_tr)
r = [i for x in map(lambda *x: x+(sum(x),), *[it]*7) for i in x] 
print(r)
或者使用更详细的
itertools.groupby
进行分组,然后取每个组的总和:

from itertools import groupby, count

c = count()
r = []
for _, g in groupby(a1_tr, lambda _: next(c)//7):
    g = list(g)
    g.append(sum(g))
    r.extend(g)
print(r)

只使用一个列表如何

In [38]: res = []

In [39]: temp = [res.append(el) if (idx+1)%7 != 0 else res.extend([el, sum(a1_tr[idx-6:idx+1])]) for idx, el in enumerate(a1_tr)]

In [40]: res
Out[40]: 
[21.1,
 10.5,
 6.31,
 21.1,
 6.31,
 6.3,
 10.4,
 82.02000000000001,
 17.1,
 7.61,
 17.2,
 7.6,
 15.4,
 8.54,
 8.53,
 81.97999999999999,
 21.1,
 9.47,
 7.01,
 9.47,
 7.01,
 6.98,
 21.1,
 82.13999999999999,
 8.34,
 16.7,
 16.7,
 8.34,
 15.3,
 8.28,
 8.39,
 82.05,
 9.83,
 20.4,
 6.77,
 6.78,
 21.8,
 9.69,
 6.78,
 82.05,
 7.73,
 16.7,
 8.33,
 8.34,
 7.74,
 16.7,
 16.7,
 82.24,
 8.2,
 16.5,
 8.23,
 16.4,
 8.18,
 8.2,
 16.5,
 82.21,
 21.1,
 21.1,
 21.1,
 21.1,
 21.1,
 21.1,
 21.1,
 147.7]

下面是另一种方法,使用和的组合


把它分成7个数字的列表,附加总数,然后重新加入列表。谢谢你的建议!这里的np是什么?
将numpy导入为np
(y),以注意到您在前面的代码中遇到的问题。我必须承认,我还没有找到一个解决方案,可以在列表理解中向列表传递两个元素,而您也没有,因此必须选择
.append()
.extend()
。在一个循环周期中,列表理解中是否真的没有机会产生两个元素?也许可以从列表中创建一个额外的“循环”循环?
new = []
it = iter(a1_tr)
take = list(islice(it,7)) # take the first 7 elements
while take: #while there is something do
    new += take
    new.append( sum(take) )
    take = list(islice(it,7)) # take the next 7 elements
print(new)