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

Dan*_*age 8 python contains list

我有两个列表,A&B,我想测试是否A包含在B."包含"是指元素A以完全相同的顺序出现,而B它们之间没有其他元素.我正在寻找的是非常类似于A in B它们是字符串的行为.

A将重复一些要素.我们可以假设A将比短于B.

关于SO的类似问题有很多答案,但大多数答案都有不同的问题:

  • A元素B吗?(不是我的问题:B是一个平面列表,而不是列表列表.)
  • 是否A包含所有元素B?(不是我的问题:我也关心订单.)
  • A一个子列表B?(不是我的问题:我不想知道这些元素是否以A相同的顺序出现B,我想知道它们是否与它们在某处完全一样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
Run Code Online (Sandbox Code Playgroud)

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

Aus*_*tin 4

any与列表切片一起使用:

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

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

def contained_in(lst, sub):
    return ','.join(map(str, sub)) in ','.join(map(str, lst))
Run Code Online (Sandbox Code Playgroud)

用法

>>> contained_in([1, 2, 3, 4, 5], [2, 3, 4])
True
>>> contained_in([1, 2, 2, 4, 5], [2, 3, 4])
False
Run Code Online (Sandbox Code Playgroud)