2013-06-11 143 views
0

我有一个if 语句将检查我已分配给变量movieTitle的字符串是否包含预定义字典中的键值对的值。Python字典 - 值

我的代码是:

import mechanize 
from bs4 import BeautifulSoup 

leaveOut = { 
      'a':'cat', 
      'b':'dog', 
      'c':'werewolf', 
      'd':'vampire', 
      'e':'nightmare' 
      } 

br = mechanize.Browser() 
r = br.open("http://<a_website_containing_a_list_of_movie_titles/") 
html = r.read() 
soup = BeautifulSoup(html) 
table = soup.find_all('table')[0] 

for row in table.find_all('tr'): 
    # Find all table data 
    for data in row.find_all('td'): 
     code_handling_the_assignment_of_movie_title_to_var_movieTitle 

     if any(movieTitle.find(leaveOut[c]) < 1 for c in 'abcde'): 
      do_this_set_of_instructions 
     else: 
      pass 

我的想法是,我可以通过使用 .find()方法中,如果值是测试字符串 movieTitle任何字典(预定义的)的值的发现将返回一个大于(或至少)等于1的索引整数值。因此,如果条件的结果是< 1(通常为-1,当不存在时),我可以继续执行程序的其余部分,否则不执行程序的其余部分。但是,当我使用Aptana调试功能时,我可以看到我的这个 if模块上的断点从不参与,就好像Aptana正在跳过它一样。为什么是这样?

编辑:

拥有包括为清楚起见更多的代码。审查了我使用@kqr建议的代码的建议。但是,尽管在leaveOut字典中包含字符串值,但我的实际程序仍显示movieTitle。为什么?

+1

你真的想使用按位还是('|')而不是逻辑或('或')吗? – mgilson

+3

此外,也许'任何(movieTitle.find(leaveOut [c])<1 for'in'abcdefghijklm')'可能会更简洁。 – mgilson

+0

无论dict的值是否在'movieTitle'中找到,都会一致地返回True,因此为什么'if'块不适合我。 –

回答

0

你能确切地确定哟你想在这里实现吗?如果leaveOut字典中的任何值不在movieTitle中,您正试图执行一组指令?如果是这样的话:

if [x for x in leaveOut.values() if x not in movieTitle]: 

会更加简洁。另外,如果你要使用上面的公式,那么比较器必须是0而不是1,否则在第一个字符处的匹配将触发该组指令。

+0

基本上,我有一个字典,按照常规键值对。在我原来的文章中的if区块之前,我在我的实际程序中使用了BeautifulSoup来将一个字符串从一个网页分配给变量'movieTitle'(在我的文章中,我指定了我抓取一个电影标题并将其指定为一个字符串)。我试图实现的是:1.检查我的字典中是否有任何值存在于字符串中,2。如果是,则跳过说明。 'do_this_set_of_instructions'。 –

+0

“另外,如果你打算使用上面的公式,那么比较器必须是0而不是1,否则第一个字符的匹配将触发”我没有遵循的指令集“。 find()方法是不是只能找到我在字典中指定的确切单词? –

+0

谢谢,在这种情况下,我认为这会做到这一点。我所做的第二点基本上就是'hello world“.find(”hello“)'返回'0',因为数组在python中是零索引的。如果你的if子句在任何'find'返回的'find'上触发,那么它将在'movieTitle'字符串的最开始执行匹配指令以及任何根本找不到的指令(因此返回' -1')。 – richsilv

1

我相信你应该使用'或'。看起来你正在使用二进制或(|字符)。

例如:

if ((movieTitle.find(leaveOut['a']) < 1) or 
    (movieTitle.find(leaveOut['b']) < 1) or 
    (movieTitle.find(leaveOut['c']) < 1) or .... 
+0

是的,你是对的。谢谢。 –

3

你可以做天鹰船长建议,或者你可以用替换整个if条件:

if any(movieTitle.find(leaveOut[c]) < 1 
     for c in 'abcdefghijklm'): 

关于你的第二个问题,你确定你不't的意思是

if not any(movieTitle.find(leaveOut[c]) < 1 
      for c in 'abcdefghijklm'): 
+0

这会更好。 –