用一个Python程序来判断一个字符串是否是另一个字符串的sublist

刷题时遇到这样一道题目,刚开始没有什么头绪,后来参考了给出的答案:

def is_sublist(l,s):
    sub_set=False
    if s==[]:
        sub_set=True
    elif s==l:
        sub_set=True
    elif len(s)>len(l):
        sub_set=False
    else:
        for i in range(len(l)):
            if l[i]==s[0]:
                n=1
                while(n

显然,答案考虑很全面,如果s==[]或者s==l,那么为True,如果len(s)>len(l),那么为False,可见写程序时要先把最简单的情况列出来,然后在else中,依次将l的每个元素与s[0]比较,如果相等,说明有可能为True,取n来作为l中与s相等的元素的个数,如果n

理解了答案的思路之后,再自己下手写一遍:

def is_sublist(l,s):
    sub_set=False
    if s==[]:
        sub_set=True
    elif s==l:
        sub_set=True
    elif len(s)>len(l):
        sub_set=False
    else:
        for i in range(len(l)):
            if l[i]==s[0]:
                n=1
                while (l[i+n]==s[n])and (n

看上去两个程序没有什么区别,然而,这时报错了。错误原因是:list index out of range.,并且指向了while语句。可是和上面对比,除了and前后两个条件的顺序不同之外,没有什么其他不一样,就很奇怪然后去查了Python中and的用法,有人做过笔记说明Python中的and语句是从左向右执行,如果所有条件都满足,返回最后一个条件,or语句是只要满足该条件就返回。所以这个地方的错误原因是当and语句前后顺序交换后就会先执行左边的条件,在这里,n=len(s)-1满足while之后的条件,n+1即n=len(s),while循环继续进行,这时就出现了问题,s[len(s)]不存在,即超出了范围,因此会报错。而对于第一种写法,当n=len(s)-1后n+1=len(s),对于and语句的左边第一个条件就不满足,就不会执行第二个条件了

说到范围问题,我的某位大神同学又发现了之前第一个程序中的一个问题,如果s的第一个元素正好是l的最后一个元素并且len(s)>1,根据程序这时n=1,那么在下面的while语句之后满足n

def is_sublist(l,s):
    sub_set=False
    if s==[]:
        sub_set=True
    elif s==l:
        sub_set=True
    elif len(s)>len(l):
        sub_set=False
    else:
        for i in range(len(l)):
            if l[i]==s[0]:
                n=1
                while (l[i+n]==s[n])and (n

显然这个会报错并且错误原因与第二个程序一样。看来答案也没有考虑到这一点。于是再次改进,既然如此,那么只要是s的第一个元素等于l的最后一个元素并且len(s)>1,就要返回False。以下是我新写的程序:

def is_sublist(l,s):
    if s==[]:
        return True
    elif s==l:
        return True
    elif len(s)>len(l):
        return False
    else:
        for i in range(len(l)):
            if l[i]==s[0]:
                if i==len(l)-1 and len(s)>1:
                    return False
                else:
                    n=1
                    while (l[n+i]==s[n])and(n
执行后显示了正确结果。以上是通过这个问题进一步了解了Python中and的用法和list的索引范围问题,如有不足,还请大家指教~

你可能感兴趣的:(用一个Python程序来判断一个字符串是否是另一个字符串的sublist)