有没有办法根据小数位在python中对数组/列表的值进行动态分组?

Posted

技术标签:

【中文标题】有没有办法根据小数位在python中对数组/列表的值进行动态分组?【英文标题】:Is there a way to dynamically group values of a an array/list in python based on their decimal places? 【发布时间】:2021-10-25 08:07:53 【问题描述】:

我有以下一维数组:

B = [8.55905955, 8.63646974, 21.7694643, 21,87843119, 21.92463355]

基于这个数组,我想要一个只包含相似值的平均值的新数组。对于上面显示的数组,它应该导致一个新的数组,如:

B_new = [8.598, 21.858]

应该考虑什么:

B 中的值的总数是可变的。应该分组的值的数量是可变的(可以是 2、3、4、5,甚至只有一个)。一组中考虑的值的阈值应基于连续值之间的距离,例如,[8.5, 8.7, 8.8] 应为一组,[8.5, 8.7, 9.9, 10.2] 应导致两组,因为差异8.7 和 9.9 之间大于 1。

任何帮助将不胜感激。

谢谢

【问题讨论】:

idownvotedbecau.se/noattempt 【参考方案1】:

简单的分步生成器函数:

def chunk_avg(array, min_gap=1):
    chunk = []
    for n in array:
        if chunk and chunk[-1] + min_gap < n:
            yield sum(chunk) / len(chunk)
            chunk.clear()
        chunk.append(n)
    if chunk:
        yield sum(chunk) / len(chunk)

list(chunk_avg([8.55905955, 8.63646974, 21.7694643, 21.87843119, 21.92463355]))
# [8.597764645000002, 21.857509679999996]
list(chunk_avg([8.5, 8.7, 9.9, 10.2]))
# [8.6, 10.05]

【讨论】:

【参考方案2】:
from more_itertools import split_when
from statistics import mean

B = [8.55905955, 8.63646974, 21.7694643, 21.87843119, 21.92463355]

B_new = [*map(mean, split_when(B, lambda x, y: y - x > 1))]

【讨论】:

可能想提一下,这需要安装一个额外的包。

以上是关于有没有办法根据小数位在python中对数组/列表的值进行动态分组?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 YAML 中对数组进行别名/锚定?

有没有办法读取除python apache beam中定义的文件列表之外的所有文件?

有没有办法将图像文件夹(png、gif)转换为 Python 中的数组列表?

Python Pandas:有没有办法根据列表中的字符串获取子集数据帧

有没有办法在 Python 中对 FITS 文件使用算术运算?

有没有办法在 Python 中对 1900 年之前的日期使用类似 strftime 的函数?