Сериализовать строку, используя Redu () в Python - PullRequest
1 голос
/ 20 октября 2019

Я пытаюсь освоить способ функционального программирования в Python. Я пытаюсь сериализовать список строк в Python, используя следующий код

S = ["geeks", "are", "awesome"]
reduce(lambda x, y: (str(len(x)) + '~' + x) + (str(len(y)) +  '~' + y), S)

Я ожидаю:

5~geeks3~are7~awesome

Но я вижу:

12~5~geeks3~are7~awesome

Кто-то может указать, почему? Заранее спасибо!

Ответы [ 4 ]

2 голосов
/ 20 октября 2019

reduce функция на каждой текущей итерации опирается на предыдущий элемент / расчет (характер всех уменьшение подпрограмм), поэтому вы получили 12 в началерезультирующая строка: на 1-ом проходе элемент был 5~geeks3~are с длиной 12, который использовался / добавлялся на следующей итерации.

Вместо этого вы можете использовать простой последовательный подход:

lst = ["geeks", "are", "awesome"]
res = ''.join('{}~{}'.format(str(len(s)), s) for s in lst)
print(res)    # 5~geeks3~are7~awesome
1 голос
/ 20 октября 2019

Вам необходимо добавить параметр initializer - пустую строку в функцию reduce(). Это будет первый аргумент, переданный функции lambda перед значениями из списка.

from functools import reduce

S = ["geeks", "are", "awesome"]

reduce(lambda x, y: x + f'{len(y)}~{y}', S, '')
# 5~geeks3~are7~awesome

Эквивалентно:

((('' + '5~geeks') + '3~are') + '7~awesome')
# 5~geeks3~are7~awesome
1 голос
/ 20 октября 2019
  • вот решение для pyton3.7+ с использованием fstring.
>>> S = ["geeks", "are", "awesome"]
>>> ''.join(f'{len(s)}~{s}' for s in S)
'5~geeks3~are7~awesome'
1 голос
/ 20 октября 2019

Функция reduce предназначена для агрегирования. Вместо этого вы пытаетесь сопоставить.

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

''.join(map(lambda x: str(len(x)) + '~' + x, S))

Возвращает:

5~geeks3~are7~awesome
...