python列表和子列表

时间:2011-02-28 22:43:07

标签: python list 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

3 个答案:

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

答案 1 :(得分:1)

您可以从以下内容开始:

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会从匹配元素开始比较所有lst1lst2的子列表并获取下一个len(lst)元素。

答案 2 :(得分: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