Python 2.7 — условная передача пустых пар k, v в dict вместо перехода к следующему итератору

РЕДАКТИРОВАТЬ 2: опубликовать больше кода, который может упростить выявление моей ошибки (ошибок). Код, кажется, игнорирует мой оператор «продолжить», поэтому он обрабатывает слова, которые следует игнорировать, что загромождает мой вывод пустыми парами ключ/значение.

        for line in tweets_lines:
            total = line.split() ###this gives me each line broken out by word.  Need to get value of each word, then sum each line. 
            line_score = {}
            for word in total:
                if word not in scores: continue
                line_score[word] = scores[word] #Add words from Tweets that are found in AFINN sentiment file to new dictionary, then assign each the value from AFINN.

            line_sentiment = sum(line_score.itervalues())
            print (line_score, line_sentiment)

Первый пост здесь, и я не разработчик. Я перебираю набор слов, и у меня есть проверка, чтобы определить, найдено ли каждое слово в словаре. Если слово не найдено в словаре, я хочу проигнорировать слово и перейти к следующему слову. Слова, найденные в словаре, добавляются в другой словарь. Моя проблема в том, что вместо того, чтобы пропускать слова, которых нет в словаре, мой код добавляет «пустые» пары ключ/значение во второй словарь. Слова, которые я перебираю, находятся в переменной с именем «всего», поэтому мой код выглядит так:

    for word in total:
        if word not in scores : continue
        #do work

Где «scores» — это имя словаря, по которому я проверяю.

Я также попытался удалить «не» и использовать оператор Else с командой «Продолжить», но результаты те же. Я понимаю, что мог бы очистить это за пределами Python, но я хотел бы сделать это «правильным» способом. Кто-нибудь может дать руководство?

РЕДАКТИРОВАТЬ: по предложению, вот снимок экрана с выводом моей консоли: !http://imgur.com/E5Fwdv3

первая строка в кадре — это то, что мне нужно: словарь с ключами/значениями, которые были найдены в словаре scores. Вторые две строки показывают выходные данные, которые, как я надеялся, будут отброшены в цикле, о котором я упоминал выше. Обратите внимание, что я также пробовал это так:

    for word in total:
        if word in scores:
            #do work

но это дает мне такой же вывод на снимке экрана. Короче говоря, я получаю результат, который хочу, но я также получаю «мусор», который я хотел бы обработать в своем коде. еще раз спасибо...


person Marcus    schedule 21.11.2015    source источник
comment
опубликуйте пример вместе с ожидаемым результатом.   -  person Avinash Raj    schedule 21.11.2015


Ответы (3)


Я думаю, что вы говорите:

Для каждого твита, если он содержит специальные слова, сгенерируйте «line_score». Если он не содержит каких-либо специальных слов, вообще не генерируйте оценку.

К сожалению, никакое «продолжить» не будет охватывать обе ситуации, независимо от того, как вы его отступите. Это отдельные вещи. Вы должны перебрать все слова, а затем, если они не совпадают, не генерировать сумму.

Что вы хотите, так это определить, не были ли обнаружены слова для подсчета очков, и не генерировать сумму, если это так. Вы можете установить флаг, если слово было обнаружено, или вы можете оптимизировать это, поняв, что line_score будет по-прежнему пустым, если ничего не было оценено.

tweets_lines = ['one two other', 'four other six', 'nothing matches']

scores = {
    'one': 1,
    'two': 2,
    'four': 4,
    'six': 6,
    }

for line in tweets_lines:
    total = line.split()
    line_score = {}
    for word in total:
        if word in scores:
            line_score[word] = scores[word]

    if line_score:  ## NEW: If line_score is empty, we skip this.
      line_sentiment = sum(line_score.itervalues())
      print (line_score, line_sentiment)

Результат, который я получил:

({'two': 2, 'one': 1}, 3)
({'four': 4, 'six': 6}, 10)

Перед добавлением «if line_score» я получил:

({'two': 2, 'one': 1}, 3)
({'four': 4, 'six': 6}, 10)
({}, 0)
person TomOnTime    schedule 22.11.2015
comment
Спасибо!! Пометил это как ответ. Два дополнительных вопроса для моего собственного понимания: 1. мой код имеет только словарь line_score внутри цикла for, но ваш код также перечисляет его до этого цикла. Есть ли причина для этого? 2. учитывая добавление if line_score (в котором вся разница), на самом деле нет необходимости иметь if/if not/continue, верно? так как вы говорите, что каждое слово нужно добавить в словарь line_score... - person Marcus; 23.11.2015
comment
1. Верно. Этот первый line_score = {} не нужен. Я отредактирую. 2. нет, не каждое слово нужно добавлять... из того, что вы сказали ранее, только забитые слова, - person TomOnTime; 23.11.2015
comment
Понятно. Таким образом, ключевой урок для меня заключается в том, что каждое слово должно быть оценено, они не могут быть отфильтрованы в начальном цикле. Только после этого я могу применить фильтр, чтобы получить нужные результаты. Спасибо еще раз. - person Marcus; 24.11.2015

Не было бы более разумно проверить слова, которые есть в словаре, и затем выполнить работу? Вот так:

for word in total:
    if word in scores:
        #do work

Это уже будет игнорировать слова, которых нет в словаре.

person Charles David    schedule 21.11.2015
comment
if word not in scores: continue имеет одно преимущество: он имеет на один уровень отступа для #do work меньше, чем не использует его. В остальном они эквивалентны. - person Dan D.; 21.11.2015
comment
Действительно, что было бы наилучшей практикой в ​​этом случае? Или это просто случай личных предпочтений? - person Charles David; 21.11.2015
comment
Лично я бы начал с if ...: continue, потому что, если все тело цикла контролируется if, легче понять все, ничего не происходит в этом случае в строке или двух с continue, где if для всего тела нужно вам нужно прокрутить до конца if, чтобы убедиться, что больше ничего не происходит. - person ShadowRanger; 21.11.2015

Это то, что вы хотите?

another_dict = {}
for word in total:
    if word in scores:
        if word not in another_dict:
            another_dict[word] = True

В качестве альтернативы, если вы хотите включить больше операторов после присваивания, может быть предпочтительнее это форматирование:

another_dict = {}
for word in total:
    if word not in scores:
        continue
    if word in another_dict:
        continue
    another_dict[word] = True
person TomOnTime    schedule 21.11.2015
comment
Спасибо, Том. У меня проблема в том, что оператор continue, похоже, не делает то, что я хочу. Если слово не в баллах, я хочу полностью пропустить слово. Но код, кажется, обрабатывает каждое слово, а не только слова в баллах. В результате у меня есть куча пустых пар ключ/значение словаря, которые загромождают мой вывод. - person Marcus; 22.11.2015
comment
Звучит как проблема с отступами. убедитесь, что вы постоянно используете табуляцию или пробелы, но не то и другое одновременно. Смесь может сбить с толку Python, и она может решить, что часть if не соответствует вашим ожиданиям. Я склонен использовать исключительно пробелы, чтобы не запутаться. - person TomOnTime; 22.11.2015