解析列表以查找数字序列

2024-06-03 03:24:15 发布

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

我有一个数字列表,我想检查列表中是否存在一个确定的序列。例如,对于[1,1,2,2,3,3,3,4,5,5,6]如何确定序列3-4-5是否存在

我尝试使用嵌套循环,但遇到了中断/继续问题。我现在将列表缩减为其唯一的元素,并查看我的序列是否存在:

ls = [1,1,2,2,3,3,3,4,5,5,6]

uniq_ls = []

for item in ls:
    if item not in uniql:
        uniq_ls.append(item)


for ii, item in enumerate(uniq_ls):
    if item == 3:
        if uniq_ls[ii+1] == 4:
            if uniq_ls[ii+2] == 5:
                print('yes, sequence exists')

上面的方法是有效的,但我希望在不将原始列表缩减为其唯一元素的情况下执行此操作。 我该怎么做? 正如一些人所指出的,这种方法只有在对原始列表进行排序时才有效。 它不适用于[1,1,1,3,2,2,4,3,3,4,4,4,4,4,5,3,2,1]这样的列表 我需要它为这样一个未排序的列表工作


Tags: 方法in元素列表forif排序not
2条回答

当列表未排序时,我想出了一个解决方案。我不确定这是否是最优雅、最有魅力的方式-

列表L1为[1,1,1,3,2,4,3,3,4,4,4,5,3,2,1]

我将有一个空列表L2=[],并将列表的第一项添加到其中

然后,如果前一项与当前项不同,我将使用L1中的项附加L2

因此L2最终应该看起来像[1,3,2,4,3,4,5,3,2,1] 从这个列表中很容易找到序列3-4-5

新代码:

l1 = [1,3,2,4,3,4,5,3,2,1]
l_uni = []

for ii, item in enumerate(l1):
    if ii==0:
        l_uni.append(item)
    elif l1[ii] != l1[ii-1]:
        l_uni.append(item)


for jj in range(0,len(l_uni)):
    try:
        if l_uni[jj]  == 3:
            if l_uni[jj+1] == 4:
                if l_uni[jj+2] == 5:
                    print('found sequence')
                    break
    except IndexError:
        print('no sequence')

您可以使用此功能:

def f(lst, seq):
    for n in range(len(lst)-len(seq)+1):
        if lst[n:n+len(seq)] == seq:
            return True
    return False
            
print(f([1,1,2,2,3,3,3,4,5,5,6], [3,4,5]))

输出:

True

您还可以将其转换为一行:

def f(lst, seq):
    return any(lst[n:n+len(seq)] == seq for n in range(len(lst)-len(seq)+1))

相关问题 更多 >