python列表和子列表

2024-04-25 00:28:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须检查list1是否包含在list2中。它还应该检查它是否也按该顺序出现在列表中。如果它是真的,那么它应该返回真和假

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

Tags: infalsetrue列表forreturn顺序def
3条回答

你可以从这样开始:

set(lst1).issubset(lst2)

查看lst1是否包含在lst2忽略顺序中。如果一个列表包含在另一个列表中,则可以执行以下操作:

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

最初我声明第一次检查与第二次检查无关,但是如果lst1的第一个元素不在lst2中,则必须正确处理ValueError

编辑: 顺便说一句,我比较了我的代码版本和yan的代码版本,在几乎所有的用例下,我的代码版本都要快得多,特别是如果len(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与从匹配元素开始并获取下一个len(lst)元素的lst2子列表进行比较。

我以为这个问题需要递归地解决,所以我做到了:

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,它在调用堆栈中冒泡并返回。

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

相关问题 更多 >