假设我有一个字符串矩阵
array = [['hello', 'how', 'are', 'you'],
['I', 'am', 'doing', 'okay'],
['Okay', 'did','you', 'do', 'your', 'hw','?']]
我想在每一行搜索关键词,因为假设在谈话中有两个人。
例如,矩阵有3行,每个奇数行对应于人A,每个偶数行对应于人B.
但是,我只关心A写的是什么,因为我只是在搜索A人说的话。
答案 0 :(得分:2)
这是一个例子。你的问题并不清楚你想要用匹配线做什么,但想法是你用切片[::2]
跳过每一行。这确实会创建列表的副本,因此使用像xrange(0, len(array), 2)
这样的索引可能会更有效(在Python3中使用range()
)。
keywords = ['did', 'you']
array = [['hello', 'how', 'are', 'you'],
['I', 'am', 'doing', 'okay'],
['Okay', 'did','you', 'do', 'your', 'hw','?']]
print [line for line in array[::2] if any(key in line for key in keywords)]
答案 1 :(得分:0)
要清理的第一个问题是术语。从技术上讲,你所拥有的是不是数组或矩阵。你有一份清单。
要遍历每一行,您可以使用列表索引。对于列表A
,这采用格式A[start:stop:step]
,其中开始,停止,步骤是整数(正面)或负面)和停止不包括在范围内。如果省略整数,则假定开始为0
,结束为None
,为0
步骤
因此,要迭代第一个人的话,你可以使用:
for words_a in array[::2]:
# do something
或者,对于第二个人的话,请使用array[1::2]
。
请注意,上述方法涉及构建新列表。更节省内存的方法是使用迭代器,例如itertools.slice
:
from itertools import islice
for words_a in islice(array, 0, None, 2):
# do something
答案 2 :(得分:0)
如果您不介意避开常用的列表理解,那么您可以使用简单的for
循环,然后再进行手动next
调用。这样做的好处是占用内存较小,但显然更加冗长。
acc = []
arrayiter = iter(array)
for line in arrayiter:
acc.extend([word for word in line if word in keywords])
next(arrayiter, None) # skips the next line