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

时间:2019-01-19 15:00:41

标签: python list contains

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

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

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

  • AB的元素吗? (不是我的问题:B是一个固定列表,而不是列表列表。)
  • A中是否包含B的所有元素? (不是我的问题:我也担心订单。)
  • AB的子列表吗? (不是我的问题:我不想知道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

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

8 个答案:

答案 0 :(得分: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))

或者,使用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

答案 1 :(得分:3)

许多人都发布了答案。但是我还是想发表我的努力;) 这是我的代码:

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

这是输出: 真正 假 假 假 是

答案 2 :(得分:2)

假设a总是比b短,那么您可以执行以下操作。

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

答案 3 :(得分:1)

考虑到您需要保留订单:

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

答案 4 :(得分:0)

使用此功能

我尝试不使其变得复杂

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

希望它能起作用:)

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

像这样吗?

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

答案 7 :(得分:0)

无需为每个元素切片:

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