根据相邻的差值将列表分组

Posted

技术标签:

【中文标题】根据相邻的差值将列表分组【英文标题】:Divide list into groups based on adjoining difference values 【发布时间】:2021-10-16 08:57:09 【问题描述】:

我对列表中的分组元素有以下问题。在数字图像转换之后,我分离了孔中心并将它们收集在 values 列表中,然后在计算相邻元素之间的差异之后,我得到了 diff_ar。现在我想获取属于一个组/集群的元素的索引。我假设一个部分中元素之间的最大差异应该小于 3。此外,只有在内部至少有 7 个元素时才能创建组。因此,我期望包含索引开始和索引结束的每个 od 检测组(本例中为 2)的元组列表。

Image for better issue statement

values = [73.0, 143.0, 323.0, 324.0, 325.0, 325.0, 325.0, 325.0, 325.5,
          325.5, 326.0, 326.0, 326.0, 326.0, 406.0, 406.5, 432.5, 433.0,
          433.5, 434.5, 435.0, 435.0, 436.0, 436.5, 437.5, 438.0]

diff_ar = [70.0, 180.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0,
           0.0, 0.0, 80.0, 0.5, 26.0, 0.5, 0.5, 1.0, 0.5, 0.0, 1.0, 0.5,
           1.0, 0.5]

expected_output = [(2,12),(16,24)]

【问题讨论】:

每个大于 3 的数字或数字组都应视为组分隔符。在图像中,这些值可以表示为未正确过滤的形状,因为常规模式应包含至少 7 个类似值 【参考方案1】:

第一个解决方案:使用more_itertools.split_when

import more_itertools

values = [73.0, 143.0, 323.0, 324.0, 325.0, 325.0, 325.0, 325.0, 325.5,
          325.5, 326.0, 326.0, 326.0, 326.0, 406.0, 406.5, 432.5, 433.0,
          433.5, 434.5, 435.0, 435.0, 436.0, 436.5, 437.5, 438.0]

threshold = 3
min_items = 7
groups = [(g[0][0], g[-1][0]) for g in more_itertools.split_when(enumerate(values), lambda x,y: abs(x[1]-y[1])>=threshold) if len(g) >= min_items]

print(groups)
# [(2, 13), (16, 25)]

第二种解决方案:自己编写循环。

def split_values(values, threshold, min_items):
    result = []
    prev = values[0]
    last_cut = 0
    for i,x in enumerate(values[1:], start=1):
        if abs(x - prev) >= threshold:
            if i - last_cut >= min_items:
                result.append((last_cut, i-1))
            last_cut = i
        prev = x
    if len(values) - last_cut >= min_items:
        result.append((last_cut, len(values)-1))
    return result

values = [73.0, 143.0, 323.0, 324.0, 325.0, 325.0, 325.0, 325.0, 325.5,
          325.5, 326.0, 326.0, 326.0, 326.0, 406.0, 406.5, 432.5, 433.0,
          433.5, 434.5, 435.0, 435.0, 436.0, 436.5, 437.5, 438.0]

print(split_values(values, 3, 7))
# [(2, 13), (16, 25)]

【讨论】:

这正是我想要的,谢谢

以上是关于根据相邻的差值将列表分组的主要内容,如果未能解决你的问题,请参考以下文章

分组 Python 元组列表

使用 lambda 根据列表的 Id 对列表中的对象进行分组

Python: 字典列表: 通过某个字段将记录分组

任何 jquery 1.3 兼容插件,使用用户文本输入过滤下拉列表,并根据匹配的输入字符串数进行分组

通过根据列表B分组生成列表A的子列表

如何根据某些文本标准对元组列表进行分组/存储?