Python 检查两个列表中元素的索引是否连续
如果列表1定义为Python 检查两个列表中元素的索引是否连续,python,list,for-loop,Python,List,For Loop,如果列表1定义为[15,1,20] 列表2定义为[6,15,3,1,6,20] 该函数将返回True,因为列表2以相同的顺序包含(15,1,20) 但是,如果列表2被定义为[6,1,15,20,3],则序列为(1,15,20),因此它将返回False def sublist(lst1,lst2): for i in lst1: if i in lst2: if ## ?? ## return True ret
[15,1,20]
列表2定义为[6,15,3,1,6,20]
该函数将返回True,因为列表2以相同的顺序包含(15,1,20)
但是,如果列表2被定义为[6,1,15,20,3]
,则序列为(1,15,20)
,因此它将返回False
def sublist(lst1,lst2):
for i in lst1:
if i in lst2:
if ## ?? ##
return True
return False
if语句是我感到困惑的地方,因为我不知道如何检查两个不同列表中的连续数字。获取第二个列表中原始列表中每个项目的索引列表,并检查它们是否按升序组合。获取第二个列表中原始列表中每个项目的索引列表,然后检查它们的任何组合是否按升序排列根据方法的
start
参数,以下选项将起作用:
def sublist(lst1, lst2):
ind = 0
for a in lst1:
try:
ind = lst2.index(a, ind)
except ValueError:
return False
return True
>>> sublist([1,2,3], [4,1,3,2,5])
False
>>> sublist([1,2,3], [4,1,2,5,3])
True
这将在
lst2
中迭代查找lst1
的元素,同时适当地向前移动开始索引进行查找,直到在lst2
的其余部分中找不到任何元素或找到所有元素为止。根据方法的start
参数,以下操作将起作用:
def sublist(lst1, lst2):
ind = 0
for a in lst1:
try:
ind = lst2.index(a, ind)
except ValueError:
return False
return True
>>> sublist([1,2,3], [4,1,3,2,5])
False
>>> sublist([1,2,3], [4,1,2,5,3])
True
这将在
lst2
中迭代查找lst1
的元素,同时适当地向前移动开始索引进行查找,直到在lst2
的其余部分中找不到任何元素或找到所有元素。从输入列表中选取一项,向前扫描第二个列表,直到找到匹配项,然后进行下一项,继续前进,等等
使用迭代器,测试下一个值非常简单。使用为lst1
创建迭代器,然后按列表顺序为您提供下一项。当该调用引发StopIteration
时,您知道已经测试了第一个列表中的所有值:
def sublist(lst1, lst2):
source = iter(lst1)
try:
item = next(source)
for value in lst2:
if item == value:
item = next(source)
return False
except StopIteration:
# all items in lst1 checked
return True
演示:
请注意,如果
lst1
为空(空列表始终是一个有序的子集),该函数还返回True
,如果lst1
不是空的,但lst2
是空的(空列表永远不能是超集),则返回False
.从输入列表中选择一项,向前扫描第二个列表,直到找到匹配项,然后选择下一项,继续向前,等等
使用迭代器,测试下一个值非常简单。使用为lst1
创建迭代器,然后按列表顺序为您提供下一项。当该调用引发StopIteration
时,您知道已经测试了第一个列表中的所有值:
def sublist(lst1, lst2):
source = iter(lst1)
try:
item = next(source)
for value in lst2:
if item == value:
item = next(source)
return False
except StopIteration:
# all items in lst1 checked
return True
演示:
请注意,如果
lst1
为空(空列表始终是一个有序的子集),则函数还返回True
,如果lst1
不是空的,但lst2
是空的(空列表永远不能是超集)。这将对第二个列表进行多次扫描;你可以在一次扫描中完成这项工作。是的,但这是一个懒惰的解决方案,应该会给OP一个正确的方向。它处理的边caseslist1=(15,1,10);list2=(1,15,1,10)我不确定这是一种边缘情况,你能详细说明一下吗?这在你的解决方案中不是一个问题,因为它固有地处理它,在第二个列表中需要多次扫描;你可以在一次扫描中完成这项工作。是的,但这是一个懒惰的解决方案,应该会给OP一个正确的方向。它处理的边caseslist1=(15,1,10);list2=(1,15,1,10)我不确定这是一个什么样的边缘情况,你能详细说明一下吗?在你的解决方案中不是一个问题,因为它内在地处理它。我一直在用python编写代码,却不知道iter()
已经存在了好几年了。几年来,我一直在用python编写代码,根本不知道iter()
的存在。