如何在列表中找到字符串元素的模式?

时间:2016-02-20 09:44:46

标签: python

找到'A'的索引的最有效方法是什么,这些索引紧接在字母“C”之后并且紧跟在字母“C”之后?

换句话说,我希望在下面的列表中找到模式['C','A','C']的所有示例的索引。

import random
letterlist = [random.choice('ABC') for i in range(1000)]

1 个答案:

答案 0 :(得分:2)

不幸的是,list.index只允许您搜索单个元素,而不是搜索子列表。但是,您可以使用str.findstr.index以及正则表达式搜索字符串中的子字符串。

因此,最简单的方法是将列表转换为字符串(或者首先不将字符串转换为列表),然后使用re.finditer

>>> letterstring = ''.join(letterlist)
>>> [m.start() for m in re.finditer("CAC", letterstring)]
[15, 104, some more, 986, 990]

请注意,这将为您提供整个模式的起始位置。如果您想拥有所有A的位置,则必须相应地+1

如果列表中的字符串每个字符长一个,您只需使用字符串中的索引来索引列表:

>>> indices = [m.start() + 1 for m in re.finditer("CAC", letterstring)]
>>> all(letterlist[i] == "A" for i in indices)
True

如果字符串可以更长,那么转换为字符串的方法并不可行,因为将字符串中的索引映射回列表更难,因为字符串可能是子字符串其他字符串。当然,对于包含除字符串之外的其他内容的列表,它根本不起作用。

在这种情况下,您可以直接在列表上工作,将列表的切片与某种模式进行比较:

>>> [i for i in range(len(letterlist)) if letterlist[i-1:i+2] == ["C","A","C"]]