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

Test whether list A is contained in list B

我有两个列表,A & B,我想测试 A 是否包含在 B 中。 "contained" 我的意思是 A 的元素在 B 中以完全相同的顺序出现,它们之间没有其他元素。如果它们是字符串,我正在寻找的与 A in B 的行为非常相似。

A的某些元素将重复。我们可以假设 A 将比 B.

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

如果操作是作为关键字 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中有没有简洁的方法来执行这个操作?我是否遗漏了一些可以让我更快找到答案的重要术语?

假设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 运算符:

def contained_in(lst, sub):
    return ','.join(map(str, sub)) in ','.join(map(str, lst))

用法:

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

使用这个功能

我尽量不让它变得复杂

def contains(list1,list2):

    str1=""
    for i in list1:
        str1+=str(i)

    str2=""
    for j in list2:
        str2+=str(j)

    if str1 in str2:
        return True

    else:
        return False

希望有用:)

考虑到您需要保留顺序:

def contains(sub_array, array):
    for i in range(len(array)-len(sub_array)+1):
        for j in range(len(sub_array)):
            if array[i+j] != sub_array[j]:
                break
        else:
            return i, i+len(sub_array)
    return False

您可以将 2 个列表连接成两个不同的字符串。然后,编写一个函数来检查一个字符串是否在另一个字符串中。

def containedin(a, b):
 if b in a:
  return True
 return False`

是这样的吗?

class myList(list):
    def in_other(self, other_list):
        for i in range(0, len(other_list)-len(self)):
            if other_list[i:i+len(self)] == self:
                return True
            else:
                continue

if __name__ == "__main__":

    x = myList([1, 2, 3])
    b = [0, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6]

    print(x.in_other(b))

很多人 post 编辑了他们的答案。但无论如何我都想 post 我的努力 ;) 这是我的代码:

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]))

这是输出: 真的 错误的 错误的 错误的 真

无需为每个元素切片:

def contains(seq, sub):
    sub_length = len(sub)
    sub_first = sub[0]
    return any(sub == seq[index:index+sub_length]
               for index, element in enumerate(seq)
               if element == sub_first)

用法:

>>> seq = [1, 2, 3, 4, 5]
>>> sub = [2, 3, 4]

>>> contains(seq, sub)
True