1

文字列のリスト (約 100) があり、そのうちの 1 つが別の文字列で最初に出現した場所と、それが発生したインデックスを見つけたいと考えています。

インデックスを保持し、あとがきはそのインデックスから別の単語リストを使用して再度検索し、文字列の末尾に到達するまで最初のリストに戻ります。

私の現在のコード(最初に出現したものを検索する)は次のようになります。

        def findFirstOccurence(wordList, bigString, startIndex):
            substrIndex = sys.maxint
            for word in wordList:
                tempIndex = bigString.find(word, startIndex)
                if tempIndex < substrIndex and tempIndex != -1:
                    substrIndex = tempIndex
            return substrIndex  

このコードは仕事をしますが、多くの時間がかかります (同じ単語リストに対して数回実行しますが、100 個の大きな文字列 (それぞれ約 10K-20K 単語) で実行します)。

私はもっ​​と良い方法があると確信しています(そしてそうするためのよりpythonicな方法)。

4

3 に答える 3

1

これはうまく機能しているようで、見つかった単語が表示されます (ただし、省略される可能性があります)。

words = 'a big red dog car woman mountain are the ditch'.split()
sentence = 'her smooth lips reminded me of the front of a big red car lying in the ditch'

from sys import maxint
def find(word, sentence):
    try:
        return sentence.index(word), word
    except ValueError:
        return maxint, None
print min(find(word, sentence) for word in words)
于 2013-02-17T09:41:55.117 に答える
0

リスト内包表記のワンライナーは

return min([index for index in [bigString.find(word, startIndex) for word in wordList] if index != -1])

しかし、それを2行に分割すると、より読みやすくなると私は主張します。

indexes = [bigString.find(word, startIndex) for word in wordList]
return min([index for index in indexes if index != -1])
于 2013-02-17T08:24:39.590 に答える
0
import re

def findFirstOccurence(wordList, bigString, startIndex=0):
    return re.search('|'.join(wordList), bigString[startIndex:]).start()

wordList = ['hello', 'world']
bigString = '1 2 3 world'

print findFirstOccurence(wordList, bigString)
于 2013-02-17T10:42:20.777 に答える