私は 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
速度が問題になる場合は、実際にはこの最後の方法が 2 つのオプションの中で高速です。
$ 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