【问题标题】:Python: can I use dict update inside the map function?Python:我可以在 map 函数中使用 dict update 吗?
【发布时间】:2020-10-10 12:13:17
【问题描述】:

我有以下输入 inp = [{1:100}, {3:200}, {8:300}],我想将其转换为字典。我可以的

dct = dict()  
for a in inp:  
    dct.update(a)

或者我可以做

_ = [dct.update(a) for a in inp]

但我想做这样的事情:

map(dct.update, inp)

【问题讨论】:

  • map 操作是转换结果并检索它,所以没有。就像你的列表理解一样,它是检索结果而不是使用有状态的方法
  • 可以但你不应该。这同样适用于您的列表理解,您不应该使用它来调用dict.updatemap 和理解构造都是函数式编程构造,用于使用纯函数对任意迭代表示映射/过滤操作。你的函数不应该有副作用,它们绝对不应该只用于副作用
  • 理想情况下,您也不应该为此任务进行列表理解。您的第一种方法似乎很简单,而且可能是最快的。

标签: python


【解决方案1】:

方法map 构建一个迭代器,因此仅在需要时进行计算。所以你需要强制计算,例如使用列表

list(map(dct.update, inp))
print(dct)

但是您不应该使用列表推导式或 map 操作来生成值

您最好保留您的for-loopdict-comprehension

dct = {key:val for item in inp for key,val in item.items()}

【讨论】:

    【解决方案2】:

    为什么要使用地图来完成这项任务?

    如果你想在一行中解决它,你可以这样做:

    dct={k:v for x in inp for k,v in x.items()}
    

    【讨论】:

    • 或:dict(x for xs in inp for x in xs.items())
    【解决方案3】:

    使用链图:

    from collections import ChainMap
    
    inp = [{1: 100}, {3: 200}, {8: 300}]
    data = dict(ChainMap(*inp))
    

    【讨论】:

      【解决方案4】:

      你想要的是reduce,而不是mapmap 通过对给定序列的每个元素应用一个函数来创建一个序列,而reduce 在序列上累积一个对象。

      from functools import reduce
      inp = [{1:100}, {3:200}, {8:300}]
      dct = {}
      reduce(lambda d1, d2: (d1.update(d2) or d1), inp, dct)
      
      {1: 100, 3: 200, 8: 300}
      

      这个lambda 部分可能看起来很棘手。这样做是创建一个更新字典并返回字典本身的函数。这是因为reduce 期望累积函数返回更新的对象,而dict.update() 返回None。由于None 被解释为False,or 运算符返回第二个变量,即更新后的字典。

      这个or 技巧在此线程中归功于@kostya-goloveshko:Why doesn't a python dict.update() return the object?

      【讨论】:

      • 非常感谢!我对这种工具很感兴趣,尽管上面的单行答案对于这样的任务确实更有用/更实用。
      • 棘手,而且非常混乱。我强烈反对在这种构造中使用 NoneType 错误。
      • @goteguru 这也是在函数式构造中使用命令式代码的另一个例子。因此混乱。
      猜你喜欢
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      相关资源
      最近更新 更多