如何在列表中找到重复元素的连续序列?

2024-04-27 03:26:08 发布

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

我需要编写一个函数,给定一个整数L和整数n的列表,如果该列表包含长度为nFalse的连续序列,则返回True。你知道吗

假设我的列表是:L = [1,2,3,4,1,1,1,2,3,4]n=3。 函数应该返回True,因为第5个位置有3个。你知道吗

我试过:

def consecutive (L,n):
    for i in range(len(L)):
        if [1]*n in L:
            return True
    return False
L = [1,2,3,4,1,1,1,2,3,4]
n = 3
consecutive (L,n)

但这当然不起作用,因为[1]*3生成[1,1,1]L内没有子列表。你知道吗

有没有办法使用列表理解?比如:

L = [1,2,3,4,1,1,1,2,3,4]
result = all(x==(1,1,1) for x in range(0,len(L)+1,3))
result

同样,我知道是无效的,因为每个元素x不能等于(1,1,1)。我写下来只是想让你知道我在想什么。你知道吗


Tags: 函数infalsetrue列表forlenreturn
3条回答

如果您想知道是否有任何列表元素重复,下面的操作将起作用。当且仅当存在任何元素的n副本序列时,以下返回True

def consecutive (L,n):
    if len(L) < 1:
        return False
    if n <= 1:
        return True

    # at this point n >= 2
    elem = L[0]
    count = 1
    # so far, we have seen one copy of `elem`

    for i in range(1, len(L)):
        if L[i] == elem:
            count = count + 1
            if count >= n:
                return True
        else: # L[i] != elem
            elem = L[i]
            count = 1
    return False

如果有一个特定的元素需要重复,请考虑以下事项:

def consecutive (L,n, elem):
    count = 0
    for i in range(len(L)):
        if L[i] == elem:
            count = count + 1
            if count >= n:
                return True
        else: # L[i] != elem
            count = 0
    return False

一种方法是使用^{},它允许您对列表中的连续值进行分组。如果找到1的给定key,并且其相应值的长度>=大于n,则下面的生成器理解返回True。你知道吗

我们可以使用next在返回第一个True后立即停止迭代:

from itertools import groupby
n = 3

next((True for k,v in groupby(L) if k == 1 and len(list(v)) >= n), False)
# True

不使用导入

例如:

L = [1,2,3,4,1,1,1,2,3,4]
n = 3
def consecutive (L,n):
    c = 0
    for i in L:
        if i == 1:
            c += 1
        else:
            c = 0
        if c >= n:
            return True
    return False


print(consecutive(L,n))

相关问题 更多 >