python - Python:如何在具有容差的列表中对相似列表进行分组并取平均值?
问题描述
输入--> a = [[297, 151, 320], [293, 151, 305], [296, 151, 320], [295, 162, 306], [297, 160, 309], [300, 158, 321]
我在列表中有一个列表。我需要按列表 a[i][2] 中的第三个元素分组,公差 + 或 - 5
output_1--> a = [[[297, 151, 320], [293, 151, 318], [296, 151, 321]], [[295, 162, 306], [297, 160, 309], [300、158、305]]
稍后我需要取每个子组的平均值,例如 [297, 151, 320], [293, 151, 318], [296, 151, 321] = [(297+293+296)/3,(151+ 151+151)/3,(320+318+321)/3] 同样用于下一组
最终输出
final_output--> a=[[[295,151,320]],[[297,160,307]]]
有人能帮忙吗 ?
解决方案
一种方法是创建一个生成器函数来进行容差分组。此函数假定列表已排序,因此您需要传入一个排序列表,或对其进行修改以在函数中进行排序。我相信有人会找到一种方法来做到这一点itertools.groupby
。
def groupby_tolerance(lst, tolerance):
result = [lst[0]]
for prev, curr in zip(lst, lst[1:]):
if curr[2] - prev[2] > tolerance:
yield result
result = []
result.append(curr)
yield result
然后在您的排序列表上调用此函数(按第 3 项):
from operator import itemgetter
a = [[297, 151, 320], [293, 151, 305], [296, 151, 320], [295, 162, 306], [297, 160, 309], [300, 158, 321]]
grouped = groupby_tolerance(sorted(a, key=itemgetter(2)), 5)
这给出了分组:
[[[293, 151, 305], [295, 162, 306], [297, 160, 309]], [[297, 151, 320], [296, 151, 320], [300, 158, 321]]]
然后你可以压缩相应的元素并计算平均值:
from statistics import mean
averages = [[mean(x) for x in zip(*group)] for group in grouped]
print(averages)
平均值:
[[295, 157.66666666666666, 306.6666666666667], [297.6666666666667, 153.33333333333334, 320.3333333333333]]
推荐阅读
- c++ - 将 std::chrono::steady_clock::time_point 转换为 long double
- javascript - 在nuxt js中为特定页面禁用ssr
- python - 从 OCPP CMS 服务器接收 TriggerMessage 时出错
- ruby - 在 RUBY 中不工作的控制器中使用 Self 方法和 Respond_to
- javascript - JS字符串解构:rest参数返回不一致的数据
- python - Pyomo中缓慢的二次约束创建
- facebook - FB Graph API - 尝试访问节点类型上不存在的字段(反应)(照片)
- opencv - 类型错误:+ 的不支持的操作数类型:'NoneType' 和 'NoneType' 用于眨眼检测
- amazon-web-services - 如何从 codepipeline 将构建工件上传到 s3 存储桶?
- javascript - JavaScript 未捕获类型错误:无法读取 null 的属性“样式”:按钮 Onclick 使 html 消失