我们说我有一个这样的列表:
[['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
运算符,但我没有得到所需的输出。
答案 0 :(得分:2)
如果你关心的是这些单词按顺序显示在数组中,你可以使用collections.deque
和popleft
来遍历列表,如果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
中的每个arr
与dq
的第一个元素进行比较,我们知道当找到匹配项时,会按正确的顺序找到它,然后我们{ {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
将仅包含所需类型的列表。