获取python字符串中字符集的位置

时间:2012-11-02 06:33:28

标签: python string python-2.7

获取python字符串中字符集的位置

字符集:

    string="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    charPositionToFind=A,D,V,Y

预期输出

    postions=[0,3,21,24]

我是这样做的

 def find_all(string,char):
     return [i - 1 for i in range(len(string)) if string.startswith(char, i - 1)]

 string="ABCDEYYFGHIAAJKVLMNOPDCQRSTAAVVVUVWXYZ"
 charPositionToFind=['A','D','V','Y']
 position=[]

 for char in charPositionToFind:
    s = find_all(string,char)
    position.extend(s)
 print sorted(position)

  output:
       [0, 3, 5, 6, 11, 12, 15, 21, 27, 28, 29, 30, 31, 33, 36]

但我想要最好的方法来做到这一点

2 个答案:

答案 0 :(得分:4)

string.index会很好用,但它有两个问题。 1)它只找到角色的第一次出现,并且 2)如果找不到该字符,则引发错误,在使用index()之前需要检查是否存在。

简单地看待问题,这是解决问题的两种简单方法:

方法1:

for character in the string:
    for target in charPositionToFind:
        test if character == target

方法2:

for target in charPositionToFind:
    for character in the string:
        test if character == target

运行时,两种方法具有相同的最坏情况O(N x M),其中N是字符串的大小,M是charPositionToFind的大小。但是,使用方法1允许您使用集合删除内部循环。它还避免了必须在最后进行排序,因为您按顺序遍历字符串的字符。所以,使用list comprehension来避免for循环:

string = "ABCDEYYFGHIAAJKVLMNOPDCQRSTAAVVVUVWXYZ"
charPositionToFind = 'ADVY'
target_set = set(charPositionToFind)
position = [index for index, char in enumerate(string) if char in target_set]

答案 1 :(得分:3)

如果您需要所有事件:

import re

text = "ABCDEYYFGHIAAJKVLMNOPDCQRSTAAVVVUVWXYZ"
chars = "ADVY"
positions = [m.start() for m in re.finditer("|".join(map(re.escape, chars)), text)]
print(positions)

Output

[0, 3, 5, 6, 11, 12, 15, 21, 27, 28, 29, 30, 31, 33, 36]