Python 列表与子列表

1 投票
3 回答
10542 浏览
提问于 2025-04-16 12:42

我需要检查 list1 是否包含在 list2 中。还要检查它们在 list2 中的顺序是否正确。如果是这样,就返回 true;如果不是,就返回 false。

def check(lst1, lst2):
for x in lst1:
    for y in lst2:
        xx = lst1.sort()
        yy = lst2
        if xx != yy:
            return False
        else:
            return True

我在 for 循环这块搞得自己很困惑,而且我不知道接下来该怎么做才能修复我的代码。能给我一些提示吗?

下面是它应该如何工作的示例:

  check([4,0],[9,1,4,6,8,9])
  True
  check([1,2],[2,3,1])
  False

3 个回答

0

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们不太了解这些工具的工作原理时。

比如说,有人可能在使用某个库的时候,发现它的某个功能没有按照预期工作。这时候,了解这个库的基本用法和常见问题就显得特别重要。通常,社区里会有很多人分享他们的经验和解决方案,这些都是非常宝贵的资源。

如果你在学习编程,遇到问题时不要害怕去问别人,或者在网上查找相关的信息。很多时候,别人也曾经遇到过类似的问题,他们的解决办法可能会对你有很大的帮助。

记住,编程是一个不断学习和解决问题的过程,遇到困难是很正常的。只要坚持下去,你一定能找到解决办法。

>>> a=[9,1,4,6,8,9]
>>> by_twos=zip(a, a[1:])
>>> by_twos
[(9, 1), (1, 4), (4, 6), (6, 8), (8, 9)]
>>> (4,6) in by_twos
True
1

你可以先试试这样的代码:

set(lst1).issubset(lst2)

这个代码是用来检查列表 lst1 是否在列表 lst2 中,顺序不重要。如果这个检查通过了,说明 lst1 确实在 lst2 里,那么你可以继续做这样的事情:

ii = lst2.index(lst1[0])
if lst2[ii:ii+len(lst1)] == lst1:
   return True
else:
   return False

我最开始说第一个检查不重要,因为有第二个检查,不过如果 lst1 的第一个元素不在 lst2 里,你需要正确处理 ValueError 这个错误。

补充:顺便提一下,我对比了我写的代码和 yan 的版本,我的代码在几乎所有情况下都快得多,尤其是当 lst1 的长度比较大时(我的速度比 yan 的实现快了最多 200 倍)。你可以用 timeit 模块来试试。

def check(lst1,lst2):
    try:
        ii = lst2.index(lst1[0])
    except ValueError:
        return False

    if lst2[ii:ii+len(lst1)] == lst1:
        return True
    else:
        return False 

关于它是如何工作的,ii = lst2.index(lst1[0]) 这行代码是找到 lst2 中与 lst1 的第一个元素相匹配的索引。如果这个元素在 lst2 中不存在,它会捕捉到 ValueError 错误,并返回 False。如果这个元素存在,lst2[ii:ii+len(lst1)] == lst1 这行代码会比较 lst1 和从匹配的元素开始的 lst2 的子列表,取接下来的 len(lst) 个元素进行比较。

3

我觉得这个问题适合用递归的方法来解决,所以我这样做了:

def check(needle, haystack):
  if not needle:
      return True
  try:
    offset = haystack.index(needle[0])
    return check(needle[1:], haystack[offset+1:])
  except:
    return False

补充说明:

简单解释一下:

首先,我们要检查一下我们要找的列表是否为空(这点很重要,因为当我们开始调用自己时),因为所有的列表里面都有一个空列表,所以如果是空的,我们就返回True。接着,我们尝试在当前查看的列表中找到我们要找的列表的第一个元素。如果找到了,我们就再次调用这个函数,但稍微改变一下参数:我们已经查看了“针”(要找的元素)的第一个元素,并且在“干草堆”(当前列表)中找到了它。现在我们需要检查“针”的剩余部分是否在“干草堆”的剩余部分中。因此,我们再次调用这个函数,只传入两个列表的剩余部分。“针”的剩余部分就是除了第一个元素之外的所有元素,而“干草堆”的剩余部分就是在我们找到的那个元素之后的所有元素。如果我们到达一个点,发现第一个列表是空的,这意味着我们在干草堆中找到了它。如果出现异常,说明我们要找的东西没有找到,这时我们就返回False,这个结果会向上返回到调用的地方。

撰写回答