我写了一段时间后写了一下python,我有点生疏了,但我正以更实用的方式接近它。为了遵循我在clojure中使用的模式,我想使用类似assoc的地图(或列表理解)来设置列表中每个字典中的键。
我有一个记录列表,我想用列表推导重构它们。
记录如下:
[cbind]
我想获得一个包含时间戳和数据密钥的字典。
{
"timestamp":1232435235315,
"data": {
"foo": 2345,
"bar": 1454
}
}
我可以很容易地实现一个关联,但我希望它已经存在于一个库中:
newlist = [ assoc(x, "timestamp", x["timestamp"]) for x in mylist ]
有没有人知道一个已经包含这样的东西的图书馆或者一种pythonic的方式来简洁地做到这一点而不改变原始列表?
答案 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