繁体   English   中英

python列表和子列表

[英]python list and sublist

我必须检查list2中是否包含list1。 它还应检查它是否也按列表中的顺序出现。 如果是真的,它应该返回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

我认为问题是要求递归解决,所以我做了:

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。 然后我们尝试在我们正在查看的列表中找到我们正在寻找的列表的第一项。 如果我们找到它,我们再次调用该函数,但稍微更改一下参数:我们已经查看了'needle'的第一项,并在'haystack'中看到了它。 所以现在我们需要检查'needle'的剩余部分是否在'haystack'的剩余部分中。 所以我们只用两个列表的其余部分再次调用该函数。 针的剩余部分是除了第一个元素之外的所有东西,而干草堆的剩余部分是我们发现的之后的所有项目。 如果我们到达第一个列表为空的点,则意味着我们在大海捞针中找到它。 如果我们得到一个异常,我们找不到的东西,所以我们返回False,它会调用堆栈并返回。

您可以从以下内容开始:

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的第一个元素匹配的lst1 如果lst2缺少该项,则捕获ValueError并返回False 如果该元素确实存在,则lst2[ii:ii+len(lst1)] == lst1将所有lst1lst2的子列表进行比较,从匹配元素开始并获取下一个len(lst)元素。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM