уменьшить функцию с лямбда - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь понять, как функция Reduce работает с лямбда-функцией.

#argument digits can be "23" or "45"
def letterCombinations(self, digits):
        if '' == digits: return []
        kvmaps = {
            '2': 'abc',
            '3': 'def',
            '4': 'ghi',
            '5': 'jkl',
            '6': 'mno',
            '7': 'pqrs',
            '8': 'tuv',
            '9': 'wxyz'
        }
        return reduce(lambda acc, digit: [x + y for x in acc for y in kvmaps[digit]], digits, [''])

Однако, когда я наткнулся на выражение return, я был совершенно ошарашен, если бы кто-то помог мне разобрать выражение return, чтобы понять, что он должен do

Я уже перешел по следующей ссылке: как работает лямбда с Reduce

Q1, какое будет первое значение для cc (аккумулятор)? Q2 мое понимание, итератор будет использоваться только вторым аргументом лямбды, правильно? Q3: поведение аккумулятора (a cc) и второй аргумент отличаются в зависимости от того, присутствует инициализатор или нет?

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Интересный пример! Давайте удалим self, добавим импорт и изменим лямбду, чтобы лучше понять:

from functools import reduce
def letterCombinations(digits):
        if '' == digits: return []
        kvmaps = {
            '2': 'abc',
            '3': 'def',
            '4': 'ghi',
            '5': 'jkl',
            '6': 'mno',
            '7': 'pqrs',
            '8': 'tuv',
            '9': 'wxyz'
        }
        return reduce(lambda acc, digit: 
                      [x + y for x in acc for y in kvmaps[digit]],
                      digits, ['GLOUGLOU'])

Так что теперь, если я протестирую нашу функцию с

letterCombinations('4')

, она отвечает

>>>['GLOUGLOUg', 'GLOUGLOUh', 'GLOUGLOUi']

Итак, вы видите, что он разбивает буквы g, h, i, заданные kvmaps ['4'], и добавляет их в 'GLOUGLOU'.

И если я заменю

['GLOUGLOU']

от

['GLOUGLOU', 'DRINGDRING']

у вас будет

>>>['GLOUGLOUg',
 'GLOUGLOUh',
 'GLOUGLOUi',
 'DRINGDRINGg',
 'DRINGDRINGh',
 'DRINGDRINGi']

Оттуда вы можете увидеть, как в вашем случае работает redu () с конкатенацией di git.

Надеюсь, это немного поможет!

0 голосов
/ 28 января 2020

Ответы на все ваши вопросы приведены в документах .

reduce(lambda acc, digit: [x + y for x in acc for y in kvmaps[digit]], digits, [''])

Каким будет первое значение для cc (аккумулятор)?

В этом случае: [''], список с пустой строкой.

мое понимание, итератор будет использоваться только вторым аргументом лямбды, правильно?

Второй аргумент (в данном случае digit) - это отдельный элемент из предоставленного итератора, в данном случае digits.

- это поведение аккумулятора (a cc ) и второй аргумент отличается, если инициализатор присутствует или нет?

Нет. Инициализатор вставляется перед первым элементом в итерируемом. Если итерация пуста, инициализатор будет возвращен.

...