2013-02-17 130 views
1

我有一個字符串列表(約100),我想找到其中一個在另一個字符串中的第一次出現和索引在其中發生。我如何找到第一次出現的字符串從另一個字符串在python

我保留索引,然後再次使用該索引中的另一個單詞列表搜索並返回第一個列表,直到它到達字符串的末尾。

我當前的代碼(即搜索的第一次出現)的樣子:

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

。我肯定有一個更好的方法(和更Python的方式這樣做)。

+1

低懸的果實將在第一次發現後立即返回,但我可能會錯過某些東西。 – XORcist 2013-02-17 08:12:23

+1

findFirstOccurence()解決的根本問題是什麼? – Johnsyweb 2013-02-17 08:14:37

+0

是否可以切割大字符串,並將單詞和索引存儲爲字典,然後可以從單詞列表中查找單詞的字典? – Joe 2013-02-17 08:25:40

回答

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

'min()'不需要內部列表 – 2013-02-17 09:56:32

+0

是的。但在這種情況下,我用列表理解過濾了-1。這就是爲什麼我使用'min()'的內部列表。我在這裏錯過了什麼嗎? – 2013-02-17 09:58:46

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) 
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) 
相關問題