python - 从非常大的列表中排除特定值的平均值

标签 python python-3.x statistics mean

我正在处理一个非常大的旅行时间列表 (~1GB) 并试图对它们进行平均,但是有一个怪癖,如果旅行不可能,该值将设置为可能的最高整数值,这会破坏整个计算。旅行时间存储在列表中,列表在字典中。

从 A 点到 B 点和 B 点到 C 看起来像:

{'AB':[3,5,10],'BC':[2,3,5,10,2147483647]}

AB 之间的平均值应该是 6,BC 应该是 5(不是 429496733.4)。

如何从平均计算中排除异常值?

最佳答案

statistics模块提供了一个 mean()可以将迭代器作为输入的函数,因此您不必复制列表来过滤掉要丢弃的值。

这是您的数据的模拟示例,其中 100 万个元素中的 90% 在 1 到 9 范围内(含 1 和 9),10% 是您的流氓值:

from random import randint, random

data = [randint(1, 9) if random() < 0.9 else 2147483647 for _ in range(1000000)]

以下是如何使用 statistics.mean() 获取平均值包括异常值:

>>> from statistics import mean

>>> mean(data)
215405499.193486

…下面是迭代它的方法排除流氓值:

>>> mean(x for x in data if x != 2147483647)
4.998926301609214

将其包装在字典理解中:

>>> travel_times = {'AB':[3,5,10],'BC':[2,3,5,10,2147483647]}
>>> {k: mean(x for x in v if x != 2147483647) for k, v in travel_times.items()}
{'BC': 5, 'AB': 6}

关于python - 从非常大的列表中排除特定值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42882529/

相关文章:

statistics - 如何知道何时使用特定类型的相似度索引?欧几里德距离与 PIL 逊相关性

python - 用频率计数绘制概率密度函数

python - 如何在 vpython 中固定 Canvas 和图形的位置?

python - 将一个值与前一行中的值进行比较,并将一个值分配给另一列(Pandas) - 如何加快速度?

python - Pandas 冗余多索引

python - 为什么这个用于对异构序列进行排序的关键类表现得很奇怪?

python - 将一列中的值与第二个数据框中一列中的值进行比较

来自给定二元离散分布的随机样本

python - 当 python 添加小整数时,幕后会发生什么?

python - 为什么 ast.literal_eval ('5 * 7' ) 失败了?