如何在满足某些条件的列表中找到第 n 个顺序值的索引?

How can I find the index of the n-th sequential value in a list that meets some criteria?

我试图在列表中查找大于特定数字的第三个连续值的索引。例如在下面的示例中,我想确定有 3 个值大于 1 的索引,这将 return 索引的值为 1.4。使用我在下面尝试过的代码,我正在检索 1.3 值。

我试过使用枚举,但是这个 return 是第三个索引总数,而不是第三个顺序值。

有没有办法识别大于 1 的连续第三个值?

listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
indexBDF = [i for i, n in enumerate(listtest) if n >= 1 ][2]
print(listtest[indexBDF])

上面的代码 returns 1.3 因为它是第三个大于 1 的值。我希望代码为 return 1.4,因为它是连续第三个大于 1 的值.

您可以使用 zip()enumerate()all() 和 for 循环将值分析为三元组:

listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]

for idx, values in enumerate(zip(listtest, listtest[1:], listtest[2:]), start=2):
    if all(val > 1 for val in values):
        print(f'found 3 sequential values {values} > 1 at index: {idx}')
        break

输出:

found 3 sequential values (1.2, 1.3, 1.4) > 1 at index: 5

只需使用传统的for循环即可解决此问题:

listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]

occurrences = 0

for index,elem in enumerate(listtest):
    if elem > 1:
        occurrences += 1
                 
        if occurrences == 3:
            print("Element =", elem)
            print("Index =", index)
            occurrences = 0

    else:
        occurrences = 0

输出:

Element = 1.4
Index = 5

如果你想打印所有可能的组合,你可以试试这个:

listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]

for index,num in enumerate(listtest):
    if index+3 < len(listtest) + 1:
        num_lst = listtest[index:index+3]
        if all(num > 1 for num in num_lst):
            print("Element =",num_lst[-1],", Index =", index+2)

输出:

Element = 1.4 , Index = 5
Element = 2 , Index = 6
Element = 1.6 , Index = 7

此实现提供了一种通用方法来查找满足某些任意过滤条件的第 n 个连续元素,并且适用于包含任何数据类型的列表。

def nth_seq_item_index(item_list: list, n: int, filter: callable):
    """The nth item `n` starts at 1 (i.e. 1st sequential item). The `filter` 
    is a function returning True or False for an item in the list."""
    if n < 1:
        raise ValueError("n must be greater than 0")
    consec_count = 0
    for index, item in enumerate(item_list):
        if filter(item):
            consec_count += 1
        else:
            consec_count = 0
        if consec_count == n:
            return index
    return None


listtest = [0.56, 1.25, 0.8, 1.2, 1.3, 1.4, 2, 1.6]
indexBDF = nth_seq_item_index(listtest, n=3, filter=lambda i: i >= 1)

print(listtest[indexBDF])

输出

1.4

使用 itertools 的有点难看的版本:

>>> next(i
         for k, g in groupby(enumerate(listtest), lambda x: x[1] >= 1)
         if k
         for i, _ in islice(g, 2, None))
5

这会找到满足条件的连续项目组,然后尝试读取组中的第三个项目。第一个就是结果。