2013-06-11 3 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 

Мои мысли, что я могу проверить строку movieTitle для любого из значений словаря (предопределенной), используя .find() метод, если значение является found вернет целочисленное значение индекса больше (или, по крайней мере), равное 1. Поэтому, если результатом условия является < 1 (обычно -1, если отсутствует), я могу продолжить работу с остальной частью программы, иначе не выполнить остальной части программы.

Однако, когда я использую функцию отладки Aptana я вижу, что моя точка останова на этом if блоке никогда не занимались, как будто Aptana пропускает прямо над ним. Почему это?

Edit:

Включили больше кода для ясности. Просмотрев предложения, я использовал код, предложенный @kqr. Однако моя фактическая программа по-прежнему отображает movieTitle, несмотря на наличие строковых значений, содержащихся в dictOut dict. Зачем?

+1

Вы действительно хотите использовать побитовое (или '' ') вместо логического или (' или ')? – mgilson

+3

Кроме того, возможно, что 'any (movieTitle.find (leaveOut [c]) <1 для c в 'abcdefghijklm')', вероятно, будет более кратким. – mgilson

+0

Это возвращает True последовательно, независимо от того, найдено ли значение dict в 'movieTitle' или нет, поэтому почему блок' if' не работает для меня. –

ответ

0

Не могли бы вы точно подтвердить, Вы пытаетесь достичь здесь? Вы пытаетесь выполнить набор инструкций, если ЛЮБОЙ из значений в словаре leaveOut НЕ присутствует в movieTitle? Если да, то:

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

будет более кратким. Кроме того, если вы собираетесь использовать формулировку выше, тогда компаратор должен быть 0, а не 1, иначе спички у первого символа будут запускать набор инструкций.

+0

В основном у меня есть словарь с парами ключ-значение, как обычно. Прежде чем перейти к блоку 'if' в моем исходном сообщении, я использую BeautifulSoup в своей реальной программе, чтобы назначить строку с веб-страницы переменной' movieTitle' (в моем сообщении я указываю, что я очищаю название фильма и назначаю его как строку). Я пытаюсь достичь: 1. проверить, присутствует ли какое-либо значение в моем dict в строке, 2.если да, то пропустите инструкции. 'Do_this_set_of_instructions'. –

+0

«Кроме того, если вы собираетесь использовать формулировку выше, тогда компаратор должен быть 0, а не 1, иначе совпадения у первого символа будут запускать набор инструкций« Я не буду следовать ». Разве метод find() не найдет только точного слова, которое я указал в dict? –

+0

спасибо, в этом случае я думаю, что это сделает трюк. второй момент, который я делал, в основном состоит в том, что «hello world» .find («hello») 'возвращает' 0', поскольку массивы нулевых индексов в python. Если ваше предложение if срабатывает в любом 'find', которое возвращается как' <1', тогда оно выполнит инструкции для совпадений в самом начале строки '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

Вы можете сделать, как говорит капитан Skyhawk, или вы можете заменить весь if состояние с:

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

Что касается вашего второго вопроса, то вы уверены, что вы не t t

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

Это было бы намного лучше. –