python3.0 列表逆向相加求和?

a = [[1,100],[2,23],[6,456],[2,123],[6,456],[2,123],[6,456]]

我需要把所有的数依次相加求和

需要逆向
2和相加
(456+123)/2 = ....
3个相加
(456+123 + 456)/3 =...
.....

最后这些和放到一个列表中

数据量大的情况下,有没有高效的写法。

我用

ct = []
                for mas in range(1, len(a)):
                    sum_total = 0.0
                    for ma in range(mas):
                        sum_total += float(a[i - ma][1])
                    avg = sum_total/mas
                ct.append(avg)

第二种

ct = []
             for i in range(len(a)):
                for s in range(i - 1, -1, -1):
                    avg = np.mean([float(a[t][1]) for t in range(s, i+1)])
                    ct.append(avg)

运行的时候 效率 太慢, 有没有高效的方法?

阅读 488
avatarAI BotBETA

首先,理解你的需求是:遍历列表 a,每次累加连续的元素,并将结果存入新的列表。

对于大型数据集,我们确实需要注意代码的效率。你已经尝试了一种方法,但它的效率很低,因为你在每次循环中都从开始到当前位置做了一次完整的遍历。

我们可以尝试一种不同的方法,利用 Python 的 collections 库中的 deque 类型。deque 允许我们从两端添加或删除元素,因此我们可以在添加元素的同时从另一端删除它们,这样我们只需要遍历一次列表。

下面是一种可能的实现:

from collections import deque

a = [[1,100],[2,23],[6,456],[2,123],[6,456],[2,123],[6,456]]

# 创建一个双端队列
dq = deque()

# 遍历列表 a
for item in a:
    # 把每一对数字放入队列
    dq.append(item[1])
    if len(dq) > 1:  # 确保至少有两个元素
        # 从队列中取出两个元素并相加
        sum_total = dq.popleft() + dq.popleft()
        dq.append(sum_total)  # 把结果放回队列

# 现在 dq 中就包含了所有相加的结果
ct = list(dq)

这种方法只需要遍历列表一次,因此对于大型数据集来说会更有效率。

1 个回答
✓ 已被采纳

你是指求索引1的后缀和吗

a = [[1,100],[2,23],[6,456],[2,123],[6,456],[2,123],[6,456]]

res = [0] * len(a)
res[-1] = a[-1][1]
for i in range(len(a) - 2, -1, -1):
    res[i] = res[i + 1] + a[i][1]
print(res)
# [1737, 1637, 1614, 1158, 1035, 579, 456]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进