2014-07-01 46 views
0

我想我有一個無限循環?我創建了一個搜索詞作爲鍵和一個索引,其中這些鍵在my_string中找到。我想創建一個帶my_string中所有匹配項列表的search_dict列爲每個項作爲搜索項的索引。查找字符串中所有匹配的索引,將搜索詞和索引附加到字典中。

我的search_dict沒有被填充,只有一個項目有數百萬個項目。

my_string='Shall I compare thee to a summer\'s day?' 
#string_dict has only a single index as a value where its key was found in my_string 
string_dict={'a': 36, ' ': 34, 'e': 30, '': 39, 'h': 17, 'm': 29, 'l': 4, 'o': 22, 'e ': 19, 's': 33, 'r': 31, 't': 21, ' t': 20, 'e t': 19} 

#I'd like search_dict to have all indices for key matches in my_string 
search_dict=dict() 
for key in string_dict: 
    search_dict[key]=list() 
for item in search_dict: 
    start=0 
    end=len(my_string) 
    found=my_string.find(item,start,end) 
    while start<end: 
     if found>=0: 
      search_dict[key].append(found) 
      start=found+len(item) 
      found=my_string.find(item,start,end) 
     else: 
      break 
print search_dict 

我也試過下面的更改。仍然不確定爲什麼如果my_string.find出現-1(未找到),循環沒有爲下一個搜索關鍵迭代打破。

 else: 
      break 
#with 
     if found<0: 
      break 
+0

尋找代碼審查? –

+0

我正在這樣做,審查可能會有所幫助。我不明白爲什麼它會永遠循環。 – 12345678910111213

+0

是的,你有一個無限循環。看看第二個'while'語句中的條件。 – senderle

回答

1

我在想,如果你正在尋找子字符串而不是字符,我認爲正則表達式最好。

>>> import re 
>>> my_string='Shall I compare thee to a summer\'s day?' 
>>> search_items = ['a', ' ', 'e', 'h', 'm', 'l', 'o', 'e ', 's', 'r', 't', ' t', 'e t'] 
>>> results_dict = {} 
>>> for search_item in search_items: 
...  results_dict[search_item] = [m.start() for m in re.finditer(search_item, my_string)] 
... 
>>> for elem in results_dict: 
...  print("%s: %s" % (elem, results_dict[elem])) 
... 
a: [2, 12, 24, 36] 
: [5, 7, 15, 20, 23, 25, 34] 
e: [14, 18, 19, 30] 
h: [1, 17] 
m: [10, 28, 29] 
l: [3, 4] 
o: [9, 22] 
e : [14, 19] 
s: [26, 33] 
r: [13, 31] 
t: [16, 21] 
t: [15, 20] 
e t: [14, 19] 

雖然未在您的問題中指定,但結果中的值是子字符串的起始位置。

+0

我可以使用它來搜索字典中的鍵以及列表中的項目。避免創建列表是一個目標。這解決了我的問題。 – 12345678910111213

0

原來的問題被發現thx to @senderle - 我的字典中len = 0的項目導致無限循環。我插入了一個條件來解決這個問題。 @Slick提供了最佳解決方案

my_string='Shall I compare thee to a summer\'s day?' 
string_dict={'a': 36, ' ': 34, 'e': 30, '': 39, 'h': 17, 'm': 29, 'l': 4, 'o': 22, 'e ': 19, 's': 33, 'r': 31, 't': 21, ' t': 20, 'e t': 19} 

search_dict=dict() 
for key in string_dict: 
    search_dict[key]=list() 
for item in search_dict: 
    start=0 
    end=len(my_string) 
    found=my_string.find(item,start,end) 
    while start<end: 
     if found>=0: 
      search_dict[item].append(found) 
      start=found+len(item) 
      if len(item)==0: #Fixed! 
       break 
      found=my_string.find(item,start,end) 
     else: 
      break 
print search_dict