0

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

我的代码是:

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

我的想法是,我可以movieTitle使用该方法测试字典中任何值(预定义)的字符串.find(),如果找到该值,将返回大于(或至少)等于 1 的索引整数值。因此如果条件的结果是 <1(通常为 -1 时不存在),我可以继续执行程序的其余部分,否则不执行程序的其余部分。

但是,当我使用 Aptana 调试功能时,我可以看到我在此if块上的断点从未使用过,就好像 Aptana 正在跳过它一样。为什么是这样?

编辑:

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

4

3 回答 3

3

您可以按照 Skyhawk 船长的建议进行操作,或者您可以将整个if状况替换为:

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

至于你的第二个问题,你确定你不是这个意思

if not any(movieTitle.find(leaveOut[c]) < 1
           for c in 'abcdefghijklm'):
于 2013-06-11T17:57:12.073 回答
1

我相信您应该使用“或”。看来您正在使用二进制或( | 字符)。

例如:

if ((movieTitle.find(leaveOut['a']) < 1) or
    (movieTitle.find(leaveOut['b']) < 1) or
    (movieTitle.find(leaveOut['c']) < 1) or ....
于 2013-06-11T17:53:04.700 回答
0

您能否确切地确认您要在这里实现的目标?leaveOut如果字典中的任何值都不存在于movieTitle 中,您正在尝试执行一组指令?如果是这样:

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

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

于 2013-06-11T17:59:11.043 回答