我是 Python 的一个完整的初学者,我正在尝试为这个字符串中的每个“o”找到索引。这仅显示第一个 o 的索引,而我正在尝试找到所有这些索引:
besedilo = "Dober dan Slovenija"
print (besedilo.index("o"))
我以为我可以使用 for 循环,但我不太确定该怎么做
我是 Python 的一个完整的初学者,我正在尝试为这个字符串中的每个“o”找到索引。这仅显示第一个 o 的索引,而我正在尝试找到所有这些索引:
besedilo = "Dober dan Slovenija"
print (besedilo.index("o"))
我以为我可以使用 for 循环,但我不太确定该怎么做
使用enumerate()
:
>>> besedilo = "Dober dan Slovenija"
>>> [i for i, j in enumerate(besedilo) if j == 'o']
[1, 12]
这将遍历字符串和从 0 开始的一种计数器。如果一个字母匹配'o'
,那么计数将在列表推导返回的列表中。
或者,您可以使用该itertools
模块:
>>> import itertools
>>> [i for i, j in itertools.izip(itertools.count(), besedilo) if j == 'o'] # itertools.izip not needed if you are using Python 3
[1, 12]
请记住,enumerate()
这更有效:)。
使用列表推导enumerate()
:
indices = [i for i, c in enumerate(besedilo) if c == 'o']
演示:
>>> besedilo = "Dober dan Slovenija"
>>> [i for i, c in enumerate(besedilo) if c == 'o']
[1, 12]
该str.index()
方法还接受一个可选start
参数,即搜索的起始索引(默认为 0),因此您可以使用最后一个位置 + 1 构建一个循环来收集所有索引:
indices = []
next = -1
while True:
try:
next = besedilo.index(next + 1)
indices.append(next)
except ValueError:
break
如果速度是一个问题,那么最后一种方法实际上是两者中更快的选择:
$ bin/python -m timeit -s "test = 'Dober dan Slovenija'" "indices = [i for i, c in enumerate(test) if c=='o']"
100000 loops, best of 3: 2.51 usec per loop
$ bin/python -m timeit -s "test = 'Dober dan Slovenija'" -s "indices,next=[],-1" "while True:" " try:" " next= test.index('o', next+1)" " indices.append(next)" " except ValueError: break"
1000000 loops, best of 3: 1.06 usec per loop