2016-02-20 39 views
-1

寻找'C'字母紧跟其后的'A'的索引的最有效方法是什么?如何在列表中查找字符串元素的模式?

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

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

当你说“之前和之后”,你的意思_immediately_ preceeded跟着?已经尝试过'text.find(“A,C,A”)?另外,你是不是指“CAC”而不是“ACA”?另外,为什么你'','。join'只是为了'split(',')'之后? –

+0

感谢您的建议。你可以发布你的解决方案作为上述例子的答案吗? – themachinist

回答

2

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

因此,最简单的方法是将列表转换为字符串(或者不是字符串转换到一个列表中的第1名),然后使用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"]] 
相关问题