2011-10-08 104 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

你也可以写列表组件作为你的传统循环以获得更好的可读性(尽管我更喜欢默认的列表组件样式)... –