Как работает этот цикл for в этом словаре?

В настоящее время я изучаю модуль текстовых настроений Python через этот онлайн-курс, и лектор не смог объяснить достаточно подробно, как работает этот фрагмент кода. Я пытался искать каждый фрагмент кода по отдельности, чтобы попытаться собрать воедино то, как он это сделал, но для меня это не имеет смысла.

  1. Так как же работает этот код? Почему в скобках словаря есть цикл for?

  2. В чем логика x перед for y in emotion_dict.values() затем for x in y в конце?

  3. Какова цель позади emotion_dict=emotion_dict в скобках? Не просто emotion_dict делать?

     def emotion_analyzer(text,emotion_dict=emotion_dict):
     #Set up the result dictionary
         emotions = {x for y in emotion_dict.values() for x in y}
         emotion_count = dict()
         for emotion in emotions:
             emotion_count[emotion] = 0
    
         #Analyze the text and normalize by total number of words
         total_words = len(text.split())
         for word in text.split():
              if emotion_dict.get(word):
                   for emotion in emotion_dict.get(word):
                       emotion_count[emotion] += 1/len(text.split())
         return emotion_count
    

1 ответ

Решение

1 и 2

Линия emotions = {x for y in emotion_dict.values() for x in y} использует набор понимания. Он строит набор, а не словарь (хотя словарное понимание также существует и выглядит несколько похожим). Это сокращенная запись для

emotions = set()  # Empty set
# Loop over all values (not keys) in the pre-existing dictionary emotion_dict
for y in emotion_dict.values():
    # The values y are some kind of container.
    # Loop over each element in these containers.
    for x in y:
        # Add x to the set
        emotions.add(x)

x сразу после { в исходном наборе понимание означает, какое значение хранить в наборе. В целом, emotions это просто набор (без повторов) всех элементов во всех контейнерах в словаре emotion_dict, Попробуйте распечатать emotion_dict а также emotion и сравни.

3

В определении функции

def emotion_analyzer(text, emotion_dict=emotion_dict):

emotion_dict=emotion_dict означает, что локальная переменная с именем emotion_dict устанавливается в глобальную переменную с аналогичным именем emotion_dict, если вы не передаете ничего в качестве второго аргумента. Это пример аргумента по умолчанию.

Другие вопросы по тегам