首页 > 解决方案 > 在列表/数组中发现一系列真值的最准确方法,忽略唯一的真值

问题描述

基于应用于数据框中变量的标准,我在列表中有一系列True/False值。感兴趣范围的索引是列表中存在一系列真实值的部分(大约 15-25True个值连续) . 列表中也有随机True值。请参阅下面列表的突出部分。我需要提取True部分的开始和结束索引。忽略唯一的True行。 数据模式将始终保持不变,因此该程序对我的其他数据集有效;尽管无论如何这都不重要,因为这个问题是针对下面的数据的。

actual_data = [
        True, True, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, True, False, False,  

   True, True, True, True, True, True, True, True, True, True, 
   True, True, True, True, True, True, True, True, True, True, True, True,  

        False, False, False, False, False, False, False, True, False,
        False, True, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, True, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, False, False, False, False, False, False, False, False, False, False,
        False, True
    ]

所以感兴趣的列表部分在上面的列表中是actual_data[83:105]。我需要一种方法来发现该区域的起点和终点。

标签: pythonpython-3.x

解决方案


我会使用一个计数器并遍历枚举列表。对于遇到的每个 true,计数器加 1。对于每个 false,检查计数器是否在某个范围内(例如 15-25)。如果它在范围内,counter - index并且index会为您提供开始和结束索引。如果不在范围内,则将计数器重置为 0 并继续循环。

以下已用您的数据和回报进行了测试(83, 105)。进行任何更改以使其适合您自己的需要。我建议添加所需的最小和最大范围作为附加参数以获得更大的灵活性。

def extract_range(my_list):
    counter = 0
    for index, value in enumerate(my_list):
        if value == True:
            counter += 1
        else:
            if 15 <= counter <= 25:
                return (index - counter, index)
            else:
                counter = 0
    return (-1, -1)

推荐阅读