1

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]

しかし、私はこれを行うための最良の方法が欲しい

4

2 に答える 2

4

string.indexを使用すると便利ですが、2つの問題があります。1)文字の最初の出現のみを検出し、2)文字が見つからない場合はエラーを発生させるため、index()を使用する前に存在を確認する必要があります。

問題を単純に見ると、次の2つの簡単な方法で問題を解決できます。

方法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

実行時に関しては、2つのメソッドはO(N x M)の同じ最悪のケースを持ちます。ここで、Nは文字列のサイズであり、MはcharPositionToFindのサイズです。ただし、方法1を使用すると、セットを使用して内部ループを削除できます。また、文字列の文字を順番に繰り返すため、最後に並べ替えを行う必要がなくなります。したがって、リスト内包表記を使用してforループを回避します。

string = "ABCDEYYFGHIAAJKVLMNOPDCQRSTAAVVVUVWXYZ"
charPositionToFind = 'ADVY'
target_set = set(charPositionToFind)
position = [index for index, char in enumerate(string) if char in target_set]
于 2012-11-02T06:57:41.487 に答える
3

すべてのオカレンスが必要な場合:

import re

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

出力

[0, 3, 5, 6, 11, 12, 15, 21, 27, 28, 29, 30, 31, 33, 36]
于 2012-11-02T07:20:38.360 に答える