2011-10-08 128 views
0

我有一些代碼,看起來像這樣:Python字符串比較問題

valid = set() 
    for string in substrings: 
     for line in dictionary_words: 
      if string in line: 
       valid.add(string) 
    f.writelines(sorted(valid)) 

兩個dictionary_words和子目前列出。

substring被發現在任何dictionary_words之後,它應該繼續前進並轉到下一個substring

什麼是最好的寫作方式?

+1

@ F.C .:爲什麼不把它作爲答案,因爲它正是O.P.所要求的? –

回答

2
valid = set() 
for string in substrings: 
    for line in dictionary_words: 
     if string in line: 
      valid.add(string) 
      break 
f.writelines(sorted(valid)) 

@ F.C:如果您使用continue而不是break,它將運行內部的for循環的下一次迭代。

+0

會使用'break'跳轉到下一個「dictionary_words中的行」還是跳轉到下一個「子串中的字符串」? – some1

+1

如果在休息之後有相同縮進級別的語句與'in ... in line ...'一樣,它會跳到那裏。但沒有什麼,它會繼續下一個字符串在substrings' – Orangenhain

+1

@Srikar:我認爲使它成爲一個字典,並且使用'dictionary_of_dictionary_words.has_key(字符串)'將不起作用,因爲'字符串行'確實子字符串匹配,而has_key則不。或者也許我錯過了一些東西。 – Orangenhain

1

爲什麼不試試這個 -

valid = set() 
    for string in substrings: 
     if dictionary_words.has_key(string): 
      valid.add(string) 
    f.writelines(sorted(valid)) 

無需主for循環中額外的for循環。這has_key解決您的移動到下一個子字符串的問題是string不在dictionary_word

希望這有助於...

+0

dictionary_words是一個列表,雖然我可能使它成爲一個元組。 – some1

+0

使'dictionary_words'成爲'dict()'。既然你對查找感興趣,它會比'list'或'tuple'快得多。 –

+0

dictionary_words是一個列表,儘管我可以將它作爲一個字典。對不起,事後看來這顯然令人困惑。 – some1

1

以下(未經測試的代碼)應該等於您的循環:

valid = set(s for s in substrings for ln in dictionary_words if s in ln) 

在Python 3.0,你可以使用一套理解:

valid = {s for s in substrings for ln in dictionary_words if s in ln} 

會更有效:

valid = set(s for s in substrings if any(s in ln for ln in dictionary_words)) 
+0

非常酷。最後一行是否在2.7x下工作? – some1

+0

編輯:最後一行確實很好,謝謝FJ。 – some1

+1

沒問題,最後一行實際上更像你正在尋找的東西,相當於添加了'break'語句。 –

0
[valid.add(my_string) for my_string in substrings for line in dictionary_words if my_string in line] 
f.writelines(sorted(valid)) 

使用List Comprehensions將以更快的速度使用循環。

+0

非常感謝。可悲的是,循環比我的最後一個版本更好,這真的很難看。我會閱讀列表推導。 – some1

+0

你也可以寫列表組件作爲你的傳統循環以獲得更好的可讀性(儘管我更喜歡默認的列表組件樣式)... –