【发布时间】:2017-02-16 13:22:54
【问题描述】:
我有一个清单:
symbol_list = ['/', '.', '\"', '-']
和一个正在变化的字符串,当前包含:
string = 'This is a string/ of "text"'
我正在尝试找到最有效的方法来返回索引值,其中列表中的第一个匹配项是在字符串中进行的。例如上例中的索引值为16。
有什么建议吗?
【问题讨论】:
我有一个清单:
symbol_list = ['/', '.', '\"', '-']
和一个正在变化的字符串,当前包含:
string = 'This is a string/ of "text"'
我正在尝试找到最有效的方法来返回索引值,其中列表中的第一个匹配项是在字符串中进行的。例如上例中的索引值为16。
有什么建议吗?
【问题讨论】:
首先,使您的符号列表成为 O(1) 包含检查的集合。然后使用生成器并获取它的第一个值。我推荐 -1 作为后备值。
>>> symbol_list = ['/', '.', '\"', '-']
>>> symbol_set = set(symbol_list)
>>> string = 'This is a string/ of "text"'
>>> idx = next((idx for idx, c in enumerate(string) if c in symbol_set), -1)
>>> idx
16
【讨论】:
您可以使用enumerate() 遍历(索引、字符)对,并使用集合进行快速查找:
>>> def get_pos(s):
... for i, c in enumerate(s):
... if c in {'/', '.', '\"', '-'}:
... return i
...
>>> s = 'This is a string/ of "text"'
>>> get_pos(s)
16
【讨论】:
pattern = re.compile('['+"".join(symbol_list)+']')
print string.index(pattern.search(string).group())
【讨论】:
试试这个:
(i for i,c in enumerate(string) if c in symbol_list ).next()
【讨论】: