Обычный цикл, вероятно, лучший путь.Если вы хотите поиграть с functools
, вы можете написать:
>>> def func(foo): return foo[0], foo[1:]
...
>>> L = ['a', 'ab', 'abc']
>>> functools.reduce(lambda acc, x: tuple({**d, x: v} for d, v in zip(acc, func(x))), L, ({}, {}))
({'a': 'a', 'ab': 'a', 'abc': 'a'}, {'a': '', 'ab': 'b', 'abc': 'bc'})
Функция reduce
является фолдом: она берет текущий аккумулятор (здесь создаются дикты) и следующее значение из L
:
d, v in zip(acc, func(x))
извлекает дикты по одному за раз, а соответствующий элемент возвращаемого значения func
; {**d, x: v}
обновляет dict текущимзначение.
Я не рекомендую такой код, поскольку его трудно поддерживать.