我正在处理一个非常大的旅行时间列表 (~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/