#python-3.x #list #dictionary #lambda #functional-programming
Вопрос:
Я хочу преобразовать список в диктант с помощью правила x if x odd; (x*2, x*3) if x is even
, используя функциональное программирование на python.
Пример list([1, 2, 3])
для dict({1:1, 4:2, 6:2, 3:3})
У меня есть код, который преобразует список в {1: 1, (4, 2): (6, 2), 3: 3}
from itertools import chain
print(
dict(
map(
lambda elem:
(lambda x: (x, x))(elem) if elem % 2 == 1
else (lambda x: chain(
((x*2, x), (x*3, x))
))(elem),
list([1, 2, 3])
)
)
)
Мог ли кто-нибудь это понять?
Результат должен быть таким же, как и в этом коде
d = dict()
for x in [1, 2, 3]:
if x % 2 == 1:
d[x] = x
else:
d[x*2] = x
d[x*3] = x
Комментарии:
1. Каковы ваши критерии для «функционального программирования»? Например, допускается ли понимание? У Хаскелла есть такие…
2. У меня есть линтер в конкурсе, который не позволяет использовать ничего, кроме лямбды
3. Таким образом, ограничение- это не просто функциональное программирование….
Ответ №1:
Вы можете просто использовать понимание словаря:
lst = [1, 2, 3]
out = {k: v for v in lst for k in ((v,) if v % 2 else (v * 2, v * 3))}
print(out)
С принтами:
{1: 1, 4: 2, 6: 2, 3: 3}
ПРАВКА: Без for-циклов или каких-либо библиотек:
d = (
dict(map(lambda x: (x, x), filter(lambda x: x % 2, lst)))
| dict(map(lambda x: (x * 2, x), filter(lambda x: x % 2 == 0, lst)))
| dict(map(lambda x: (x * 3, x), filter(lambda x: x % 2 == 0, lst)))
)
print(d)
С принтами:
{1: 1, 3: 3, 4: 2, 6: 2}
Комментарии:
1. Спасибо за ваш ответ, но возможно ли вообще сделать это без циклов? использование только итерационных, функциональных, картографических и других встроенных функций
2. @DedAzaMarks Смотрите мою правку.
3. @DedAzaMarks понимание словаря-это функциональная конструкция программирования