测试列表A是否包含在列表B中

2024-09-30 14:23:00 发布

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

我有两个列表,A&;B,我想测试A是否包含在B中。我所说的“包含”是指A的元素以完全相同的顺序出现在B中,它们之间没有其他元素。我要找的与A in B的行为非常相似,如果它们是字符串的话。在

A的某些元素将被重复。我们可以假设AB短。在

类似的问题有很多答案,但大多数回答的是不同的问题:

  • AB的元素吗?(不是我的问题:B是一个平面列表,不是一个列表列表。)
  • A的所有元素都包含在^{中吗?(不是我的问题:我也关心秩序。)
  • AB的子列表吗?(不是我的问题:我不想知道A的元素是否以相同的顺序出现在B中,我想知道它们是否与{}中的某个地方一样出现在中。)

如果操作被实现为关键字containedin,它的行为将如下所示。在

>>> [2, 3, 4] containedin [1, 2, 3, 4, 5]
True
>>> [2, 3, 4] containedin [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
False
>>> [2, 3, 4] containedin [5, 4, 3, 2, 1]
False
>>> [2, 2, 2] containedin [1, 2, 3, 4, 5]
False
>>> [2, 2, 2] containedin [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
False
>>> [2, 2, 2] containedin [1, 1, 1, 2, 2, 2, 3, 3, 3]
True

在Python中有没有一种简洁的方法来执行这个操作?我是否遗漏了一些重要的术语,这些术语会让我更快地找到答案?在


Tags: 字符串答案infalsetrue元素列表顺序
3条回答

假设a总是比b短,那么可以做如下操作。在

 any(a == b[i:i+len(a)] for i in range(len(b)-len(a)+1))

any与列表切片一起使用:

def contained_in(lst, sub):
    n = len(sub)
    return any(sub == lst[i:i+n] for i in range(len(lst)-n+1))

或者,使用join将两个列表连接到字符串,并使用in运算符:

^{pr2}$

用法

>>> contained_in([1, 2, 3, 4, 5], [2, 3, 4])
True
>>> contained_in([1, 2, 2, 4, 5], [2, 3, 4])
False

许多人已经贴出了他们的答案。但我还是想把我的努力发表出来;) 这是我的代码:

def containedin(a,b):
    for j in range(len(b)-len(a)+1):
        if a==b[j:j+len(a)]:
            return True
    return False

print(containedin([2, 3, 4],[1, 2, 3, 4, 5]))
print(containedin([2, 3, 4],[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]))
print(containedin([2, 3, 4],[5, 4, 3, 2, 1]))
print(containedin([2, 2, 2],[1, 2, 3, 4, 5]))
print(containedin([2, 2, 2],[1, 1, 1, 2, 2, 2, 3, 3, 3]))

这是输出: 是的 假 假 假 是的

相关问题 更多 >