对于列表中的每个不同数字,计算数字后面数字的平均值。 (是的,很难理解)

Computing the mean of the numbers following a number, for each different number in a list. (yes, difficult to understand)

我有以下数字列表,它们是随机的:

numbers = [1, 3, 5, 5, 2, 4, 1, 5, 4, 5, 2, 2]

对于每个数字 (1, 2, 3, 4, 5) 我想知道它后面数字的平均值。

这是一个例子:
1 出现两次,分别出现在列表中的 06 位置。
在位置0,它后面紧跟着数字3 (在位置1)和在位置6后面跟着数字5(在第7位).
所以 1 出现了两次,紧接着是 3 和 5。
3和5的均值为4,(3+5)/2 = 4.0
所以 1 的结果是 4。

对 2 使用相同的方法:
2 位于位置 4、10 和 11,后面是 4 和 2。列表末尾的最后一个 2 被丢弃,因为它后面没有任何内容。
所以 2 的结果是 (4+2)/2 = 3.0

如果我继续使用此方法并将结果显示为字典,我会得到这个。

results = {
  1: 4.0,
  2: 3.0,
  3: 5.0,   # 5/1
  4: 3.0,   # (1+5)/2
  5: 3.25,  # (5+2+4+2)/4
}

我需要以高效的方式自动执行此过程,因为它应该 运行 用于非常长的列表。
我想使用 pandas 或 numpy 来解决这个问题,但我是这些软件包的初学者。
我当然正在阅读文档,但它们太长了,我觉得我会在两年内找到解决方案 :D
任何帮助、快捷方式或 link 文档的正确部分将不胜感激。

结果不必是字典。它可以是任何东西,例如一个新的数据框,只要计算是高效的,并且尽可能优雅。

感谢您的宝贵时间!

如何使用 collections.defaultdictzip(或 itertools.pairwise 用于 python 3.10+):

from collections import defaultdict

numbers = [1, 3, 5, 5, 2, 4, 1, 5, 4, 5, 2, 2]

dct = defaultdict(list)
for x, y in zip(numbers, numbers[1:]):
# (Alternatively, on python 3.10+) for x, y in itertools.pairwise(numbers):
    dct[x].append(y)

dct = {k: sum(lst) / len(lst) for k, lst in dct.items()}
print(dct)
# {1: 4.0, 3: 5.0, 5: 3.25, 2: 3.0, 4: 3.0}

Pandas 方法

s = pd.Series(numbers)
s.shift(-1).groupby(s).mean().to_dict()

{1: 4.0, 2: 3.0, 3: 5.0, 4: 3.0, 5: 3.25}