在更大的列表中查找gappy子列表

时间:2018-05-15 16:46:15

标签: python python-3.x list

我们说我有一个这样的列表:

 [['she', 'is', 'a', 'student'],
 ['she', 'is', 'a', 'lawer'],
 ['she', 'is', 'a', 'great', 'student'],
 ['i', 'am', 'a', 'teacher'],
 ['she', 'is', 'a', 'very', 'very', 'exceptionally', 'good', 'student']]

现在我有一个这样的列表:

['she', 'is', 'student']

我想用这个列表查询较大的列表,并以相同的顺序返回包含查询列表中的单词的所有列表。可能存在差距,但顺序应该相同。我怎样才能做到这一点?我尝试使用in运算符,但我没有得到所需的输出。

2 个答案:

答案 0 :(得分:2)

如果你关心的是这些单词按顺序显示在数组中,你可以使用collections.dequepopleft来遍历列表,如果deque被清空后,你找到了一个有效的匹配:

from collections import deque

def find_gappy(arr, m):
  dq = deque(m)
  for word in arr:
    if word == dq[0]:
      dq.popleft()
      if not dq:
        return True
  return False

通过将word中的每个arrdq的第一个元素进行比较,我们知道当找到匹配项时,会按正确的顺序找到它,然后我们{ {1}},我们现在正在与popleft中的下一个元素进行比较。

要过滤初始列表,您可以使用基于deque的结果过滤的简单列表推导:

find_gappy

答案 1 :(得分:0)

您可以比较两个列表,其功能与此类似。它的工作方式是循环显示较短的列表,每次在长列表中找到下一个单词时,在该点切断较长列表的第一部分。如果找不到单词,则返回false。

def is_sub_sequence(long_list, short_list):
    for word in short_list:
        if word in long_list:
            i = long_list.index(word)
            long_list = long_list[i+1:]
        else:
            return False
    return True

现在您有一个功能告诉您列表是否是所需的类型,您可以使用列表理解从“列表列表”中筛选出您需要的所有列表,如下所示:

a = [['she', 'is', 'a', 'student'],
 ['she', 'is', 'a', 'lawer'],
 ['she', 'is', 'a', 'great', 'student'],
 ['i', 'am', 'a', 'teacher'],
 ['she', 'is', 'a', 'very', 'very', 'exceptionally', 'good', 'student']]


b = ['she', 'is', 'student']

filtered = [x for x in a if is_sub_sequence(x,b)]

列表filtered将仅包含所需类型的列表。