测试列表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 上有很多类似问题的答案,但大多数回答不同的问题:
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中有没有简洁的方法来执行这个操作?我是否遗漏了一些可以让我更快找到答案的重要术语?
假设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
我有两个列表,A
& B
,我想测试 A
是否包含在 B
中。 "contained" 我的意思是 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中有没有简洁的方法来执行这个操作?我是否遗漏了一些可以让我更快找到答案的重要术语?
假设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