找到'A'的索引的最有效方法是什么,这些索引紧接在字母“C”之后并且紧跟在字母“C”之后?
换句话说,我希望在下面的列表中找到模式['C','A','C']的所有示例的索引。
import random
letterlist = [random.choice('ABC') for i in range(1000)]
答案 0 :(得分:2)
不幸的是,list.index
只允许您搜索单个元素,而不是搜索子列表。但是,您可以使用str.find
和str.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"]]