【问题标题】:List to dictionaty using functional programming in python在 python 中使用函数式编程列出字典
【发布时间】:2021-11-29 17:43:19
【问题描述】:

我想使用 Python 中的函数式编程,使用规则 x if x odd; (x*2, x*3) if x is even 将列表转换为字典。

例如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

【问题讨论】:

  • 你对“函数式编程”的标准是什么?例如,是否允许理解? Haskell 有这些……
  • 我在比赛中有一个 linter,除了 lambda 之外不允许使用任何东西
  • 那么约束仅仅是函数式编程......

标签: python-3.x list dictionary lambda functional-programming


【解决方案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}

【讨论】:

  • 感谢您的回复 但是,是否可以完全不使用 for 循环?仅使用 itertools、functools、map 等内置函数
  • @DedAzaMarks 查看我的编辑。
  • @DedAzaMarks 字典理解是一种函数式编程结构
猜你喜欢
  • 2019-08-25
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 2012-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
相关资源
最近更新 更多