Как использовать Reduce () в списке и получить словарь? - PullRequest
0 голосов
/ 07 сентября 2018

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

stem_word_dictionary = reduce(
        lambda accumulator, word_stem_tuple:
        accumulator.setdefault(word_stem_tuple[1], []).append(word_stem_tuple[0]),
        word_stem_tuple_list,
        {})

Я получаю эту ошибку:

accumulator.setdefault(word_stem_tuple[1], []).append(word_stem_tuple[0]),
    AttributeError: 'NoneType' object has no attribute 'setdefault'

Я не понимаю, что здесь происходит. Я использую пустой словарь в качестве начального значения для сокращения, поэтому не уверен, почему это «NoneType». Также отказ от ответственности: я супер новичок в Python.

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Проблема в том, что функция append() не возвращает список, который ей дан. reduce() работает путем подачи результата предыдущего вызова на вход следующего вызова. Если предыдущий вызов ничего не возвращает, он получает None, то есть значение accumulator, следующее за первым вызовом.

Запрыгните в любой python REPL и выполните простое:

a = []
a.append(1)

Видишь, как нет выхода?

0 голосов
/ 07 сентября 2018

Функция сокращения, используемая для reduce, должна всегда возвращать объект того же типа, что и его входной объект, чтобы она могла продолжить свою операцию сокращения с результирующим объектом и следующим объектом из итератора. Ваша функция lambda в данный момент вызывает dict.setdefault(), функцию, которая всегда возвращает None, поэтому она естественным образом приводит к ошибке при попытке выполнить следующую операцию сокращения с объектом None.

Для вашей цели вы должны использовать следующий цикл вместо функции сокращения:

stem_word_dictionary = {}
for w, k in word_stem_tuple_list:
    stem_word_dictionary.setdefault(k, []).append(w)
...