Python字典 - 价值

时间:2013-06-11 17:50:51

标签: python dictionary

我有一个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.因此,如果条件的结果是&lt; 1(通常在没有时为-1),我可以继续执行程序的其余部分,否则不执行其余的程序

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

编辑:

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

3 个答案:

答案 0 :(得分: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'):

答案 1 :(得分:1)

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

例如:

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

答案 2 :(得分:0)

你能确切地确认你想要在这里实现什么吗?如果movieTitle中没有leaveOut字典中的任何值,您是否尝试执行一组指令?如果是这样的话:

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

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