0

我是 Python 的一个完整的初学者,我正在尝试为这个字符串中的每个“o”找到索引。这仅显示第一个 o 的索引,而我正在尝试找到所有这些索引:

besedilo = "Dober dan Slovenija"
    print (besedilo.index("o"))

我以为我可以使用 for 循环,但我不太确定该怎么做

4

2 回答 2

2

使用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()这更有效:)。

于 2013-09-23T08:45:44.560 回答
2

使用列表推导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
于 2013-09-23T08:45:54.500 回答