1

我有一个字符串列表(大约 100 个),我想找到其中一个字符串在另一个字符串中的第一次出现以及它出现的索引。

我保留索引,然后使用该索引中的另一个单词列表再次搜索,然后返回第一个列表,直到它到达字符串的末尾。

我当前的代码(搜索第一次出现)如下所示:

        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])

但我会争辩说,如果你把它分成两行它更具可读性

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 回答