在阵列中一次访问一行

时间:2018-05-30 22:21:34

标签: python list

假设我有一个字符串矩阵

array = [['hello', 'how', 'are', 'you'],
         ['I', 'am', 'doing', 'okay'],
         ['Okay', 'did','you', 'do', 'your', 'hw','?']]

我想在每一行搜索关键词,因为假设在谈话中有两个人。

例如,矩阵有3行,每个奇数行对应于人A,每个偶数行对应于人B.

但是,我只关心A写的是什么,因为我只是在搜索A人说的话。

3 个答案:

答案 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结束None0步骤

因此,要迭代第一个人的话,你可以使用:

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