Python 求解一个列表是否作为另一个列表的子列表
我对这个问题已经研究了一段时间,只是觉得完全迷失了方向。这似乎是非常基本的,但似乎无法解决它。我不是真的在寻找一个确切的答案,只是如果我在正确的轨道上。我刚刚完成了第三周的编程入门,所以我确信某些格式有点不可靠,对此我深表歉意 我试图定义一个可以包含两个列表的函数:Python 求解一个列表是否作为另一个列表的子列表,python,python-3.x,list,Python,Python 3.x,List,我对这个问题已经研究了一段时间,只是觉得完全迷失了方向。这似乎是非常基本的,但似乎无法解决它。我不是真的在寻找一个确切的答案,只是如果我在正确的轨道上。我刚刚完成了第三周的编程入门,所以我确信某些格式有点不可靠,对此我深表歉意 我试图定义一个可以包含两个列表的函数:list1和list2,并查看list1是否作为list2的子列表,同时还考虑了排序 例如,书中的问题是这样的: 如果list1定义为: [15,1100] 而list2定义为: [20,15,30,50,1100] 然后list1是
list1
和list2
,并查看list1
是否作为list2
的子列表,同时还考虑了排序
例如,书中的问题是这样的:
如果list1
定义为:
[15,1100]
而list2
定义为:
[20,15,30,50,1100]
然后list1
是list2
的子列表,因为list1
中的数字(15、1和100)以相同的顺序出现在list2
中。
但是,list[15,50,20]
不是list2
的子列表,因为顺序不同
我不确定我是不是走对了路,但我想附上我到目前为止所拥有的,并希望任何人对它的意见。我添加了一些评论,以便更深入地了解我的思考过程
l1=eval(输入('\n请输入整数列表:'))
l2=eval(输入('\n请输入第二个整数列表:'))
def子列表(l1、l2):
'将两个列表作为用户的输入并确定'
'如果列表1是列表2的子列表,则为True;否则为false。'
newLst=[]
indexNum=0
结果=子列表(l1、l2)
如果len(l1)>len(l2):
返回错误
elif l1=[]:
返回真值
对于l1中的num:
#我的想法是,这个while循环的运行时间应该和变量indexNum的运行时间一样长
#不超过lst2的长度,允许我将lst1的每个num与lst2的每个num进行比较
当indexNum
您可以通过使用列表理解和内置检查列表是否相等来解决此问题
输出:
[([1, 3, 4], 4), ([1, 3, 4], 9)]
它在l2
如果您更喜欢“写出来”的方法而不是列表理解,您可以做类似的事情,如:
def checker(l1,l2):
"""Enuimerates over l2, finds a value thats same as l1[0] and delegates
sublistchecking to inner function checkSame"""
def checkSame(a,b):
"""gets two lists of same length and checks that theire values are identical"""
return all(a[i] == b[i] for i in range(1,len(a))) # 0 was checked already
l1_len = len(l1) # store length so we do not need to lookup it all the time
for idx,value in enumerate(l2):
if value == l1[0]: # check 0
if checkSame(l1,l2[idx:idx+l1_len]):
yield(l1,idx)
print(list(checker(l1,l2)))
如果需要将索引与值一起放入iterable中,我更喜欢使用
enumerate(iterable)
-enumerate返回以下两个值:
Doku我继续检查了你的代码。我不得不说,似乎有人故意在一个完美的解决方案中插入了错误的行:
def subList(l1, l2):
indexNum = 0
if len(l1) > len(l2): return False
for num in l1:
while indexNum < len(l2):
if l2[indexNum] == num:
indexNum = indexNum + 1
break
indexNum = indexNum + 1
else:
return False
return True
l1 = [15,1,100]
l2 = [20,15,30,50,1,100]
l3 = [15,50,20]
print(subList(l1,l2))
print(subList(l3,l2))
if…else
也在扼杀它。显然,newlst
将不等于l1
,因为当您到达这里时,您最多只检查了l1
中的一个元素-将其删除newlst
毫无用处l1
是否为空是多余的-循环将跳过,并返回Truedef subList(l1, l2):
indexNum = 0
if len(l1) > len(l2): return False
for num in l1:
while indexNum < len(l2):
if l2[indexNum] == num:
indexNum = indexNum + 1
break
indexNum = indexNum + 1
else:
return False
return True
l1 = [15,1,100]
l2 = [20,15,30,50,1,100]
l3 = [15,50,20]
print(subList(l1,l2))
print(subList(l3,l2))
def子列表(l1、l2):
indexNum=0
如果len(l1)>len(l2):返回False
对于l1中的num:
当indexNum
循环的逻辑:
l1
中获取项目l2
中找到它indexNum
在迭代之间很好地管理这一点else
如果未找到它,请返回False
l1
中的所有元素都执行了此操作,则返回True
您的解决方案不仅简单,而且效率最高。Wow。非常感谢您的帮助,尤其是对循环的彻底分解。实际上,在中断while循环之前,还需要确保增加indexNum。例如,如果您使用第一个列表
[15,1,1100]
对l2进行测试,您的代码将错误地返回True。另外,如果l1=[]:在代码中返回True,则不需要@Coop代码,空列表表示for的迭代次数为零
def subList(l1, l2):
indexNum = 0
if len(l1) > len(l2): return False
for num in l1:
while indexNum < len(l2):
if l2[indexNum] == num:
indexNum = indexNum + 1
break
indexNum = indexNum + 1
else:
return False
return True
l1 = [15,1,100]
l2 = [20,15,30,50,1,100]
l3 = [15,50,20]
print(subList(l1,l2))
print(subList(l3,l2))