1

我必须检查 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
4

3 回答 3

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' 的剩余部分中。所以我们只用两个列表的其余部分再次调用该函数。needle 的其余部分是除第一个元素之外的所有元素,而 haystack 的其余部分是我们找到的元素之后的所有元素。如果我们到达第一个列表为空的地步,这意味着我们在大海捞针中找到了它。

于 2011-02-28T22:50:13.320 回答
1

您可以从以下内容开始:

set(lst1).issubset(lst2)

查看 lst1 是否包含在 lst2 中,忽略顺序。如果它通过了一个列表包含在另一个列表中的测试,那么您可以执行以下操作:

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

最初我说第一个检查与第二个检查无关,尽管ValueError如果 lst1 的第一个元素不在 lst2 中,您必须正确处理。

编辑: 顺便说一句,我将我的代码版本与 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])索引。如果该项目丢失,它会捕获并返回。如果该元素确实存在,则比较所有与从匹配元素开始并获取下一个元素的子列表。 lst2lst1lst2ValueErrorFalselst2[ii:ii+len(lst1)] == lst1lst1lst2len(lst)

于 2011-02-28T22:55:55.877 回答
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
于 2011-02-28T22:54:28.533 回答