Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求解一个列表是否作为另一个列表的子列表_Python_Python 3.x_List - Fatal编程技术网

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))
  • 在函数的第6行有一个递归调用。这不仅没有用,而且会导致函数不断递归
  • 最后的
    if…else
    也在扼杀它。显然,
    newlst
    将不等于
    l1
    ,因为当您到达这里时,您最多只检查了
    l1
    中的一个元素-将其删除
  • 这使得
    newlst
    毫无用处
  • 在while上大量使用else。不要像这里这样自然地看到它的许多好用途-很好 我错过的@Olivier新增内容

  • 检查
    l1
    是否为空是多余的-循环将跳过,并返回True
  • 在中断之前,您仍然需要增加计数器
  • 这是固定的解决方案:

    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))
    
    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))