我有两个列表,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
有没有在Python中执行此操作的简洁方法?我是否错过了一些重要的术语,这些术语会使我更快地找到答案?
答案 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