是否有一个python函数返回一个新的dict添加了一个新的键,如clojure中的assoc?

时间:2017-10-09 13:33:41

标签: python dictionary clojure functional-programming list-comprehension

我写了一段时间后写了一下python,我有点生疏了,但我正以更实用的方式接近它。为了遵循我在clojure中使用的模式,我想使用类似assoc的地图(或列表理解)来设置列表中每个字典中的键。

我有一个记录列表,我想用列表推导重构它们。

记录如下:

[cbind]

我想获得一个包含时间戳和数据密钥的字典。

{
  "timestamp":1232435235315,
  "data": {
    "foo": 2345,
    "bar": 1454
  }
}

我可以很容易地实现一个关联,但我希望它已经存在于一个库中:

newlist = [ assoc(x, "timestamp", x["timestamp"]) for x in mylist ]

有没有人知道一个已经包含这样的东西的图书馆或者一种pythonic的方式来简洁地做到这一点而不改变原始列表?

4 个答案:

答案 0 :(得分:9)

当然,您可以简单地使用dict(),例如:

old = {"a": 1}
new_one = dict(old, new_key=value)
#or
new_one = dict(old, {...})

答案 1 :(得分:2)

从Python 3.9开始,您还可以使用Dictionary Merge and Update Operators,尽管有些人可能认为这不太明确。

该代码段将变为:

old = {"a": 1}


# 1. Merge operator

new_one = old | {"new_key": value}
## `old_one` is {"a": 1}
## `new_one` is {"a": 1, "new_key": value}


# 2. Update operator

old |= {"new_key": value}
## `old_one` becomes {"a": 1, "new_key": value}

答案 2 :(得分:1)

对我来说,接受的答案抛出

<块引用>

TypeError: dict 预计最多 1 个参数,得到 2 个

如果由于某种原因不能使用 Python 3.9,则可以定义一个如下所示的函数

def dict_update(x, **kwargs):
    y = x.copy()
    y.update(kwargs)
    return y

old = {"a", 1}

new = dict_update(old, b=2, c=3)

print(old)
>>> {"a": 1}
print(new)
>>> {"a": 1, "b": 2, "c": 3}

答案 3 :(得分:0)

如果您希望它具有与 Clojure 中类似的性能特征,PEP 603 (draft) 似乎是前进的方向。截至 2021 年初,此 PEP 尚未被接受,但存在完整的实现:https://github.com/MagicStack/immutables