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

私の考えでは、値が見つかった場合、1 より大きい (または少なくとも) 等しいインデックス整数値を返すメソッドmovieTitleを使用して、辞書 (定義済み) の値のいずれかについて文字列をテストできます。したがって、.find()条件の結果が 1 未満の場合 (通常、存在しない場合は -1)、残りのプログラムを続行できます。それ以外の場合は、残りのプログラムを実行しません。

しかし、Aptana デバッグ機能を使用すると、Aptana がその上ifをスキップしているかのように、このブロックのブレークポイントがエンゲージされていないことがわかります。どうしてこれなの?

編集:

わかりやすくするために、より多くのコードを含めました。提案を確認した後、@kqr が提案したコードを使用しました。ただし、実際のプログラムでは、leaveOut dict に文字列値が含まれているにもかかわらず、movieTitle が表示されます。なんで?

4

3 に答える 3

3

ifキャプテン・スカイホークが提案するようにするか、条件全体を次のように置き換えることができます。

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

2 番目の質問については、本当ですか?

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

「または」を使用する必要があると思います。バイナリ or( | 文字) を使用しているようです。

例えば:

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 に答える