检查列表中的模式

2024-04-30 02:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

想象一下下面的列表:

test_list = [0,1,2,3,4,5,20,21,22]

列表增加1到5,然后跳到20。 我想写一段代码,返回列表为特定序列跳转的数字。在上面的例子中,答案是5

下面的代码符合我的要求;然而,我正在寻找一个更清洁的解决方案

result = 0
for n, i in enumerate(test_list):
    if n+1 < len(test_list):
         if test_list[n]+1 == test_list[n+1]:
             result = test_list[n+1]
print(result)

另一个例子可能是:

test_list2 = [1,3,5,7,9,20,21,22]
result = 0
for n, i in enumerate(test_list2):
    if n+1 < len(test_list2):
         if test_list2[n]+2 == test_list2[n+1]:
             result = test_list2[n+1]
print(result)

Tags: 代码intest列表forlenif序列
3条回答

这里已经有了很好的答案,但是您可以用一种不必硬编码模式的方式来编写代码

将操作类型和增量作为参数,可以执行以下操作:

test_list2 = [1,3,5,7,9,20,21,22]
result = 0
operation = "+"
increment = 2
for n, i in enumerate(test_list2):
    if n < len(test_list2) - 1:
         if eval(f'{test_list2[n]}{operation}{increment}') == test_list2[n+1]:
             result = test_list2[n+1]
print(result)

实际上,我突然想到,只有在跳转后模式发生变化时,代码才会返回正确的值。如果您希望能够检测到跳转,即使之后模式保持不变,您必须打破循环:

test_list2 = [1,3,5,7,9,20,21,22]
result = 0
operation = "+"
increment = 2
i = 0
while i < len(test_list2) - 1:
    if eval(f'{test_list2[i]}{operation}{increment}') == test_list2[i+1]:
        result = test_list2[i+1]
    else:
        break
    i += 1
print(result)

您可以使用^{}和一个分组函数来对连续块进行分组,按照以下方式来做某事:

from itertools import groupby

lst = [0,1,2,3,4,5,20,21,22]

next(list(g)[-1][-1] for _, g in groupby(enumerate(lst), key=lambda x: x[1]-x[0]))
# 5

这当然不适用于第二种情况,即第一个块增加2。你必须检测到这一点

可以使用numpy查找索引,然后访问列表

idx = np.argmax(np.diff(test_list))
result = test_list[idx]

相关问题 更多 >