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

Mne*_*quo 2 python dictionary functional-programming list-comprehension clojure

我写了一段时间后写了一段蟒蛇,我有点生疏了,但我正以更实用的方式接近它.为了遵循我在clojure中使用的模式,我想使用map(或list comprehension)和assoc之类的东西在列表中的每个dict中设置键.

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

记录看起来像这样:

{
  "timestamp":1232435235315,
  "data": {
    "foo": 2345,
    "bar": 1454
  }
}
Run Code Online (Sandbox Code Playgroud)

我想得到一个包含时间戳和数据键的字典.

newlist = [ assoc(x, "timestamp", x["timestamp"]) for x in mylist ]
Run Code Online (Sandbox Code Playgroud)

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

def assoc(coll, k, v):
  newcoll = coll.copy()
  newcoll[k] = v
  return newcoll  
Run Code Online (Sandbox Code Playgroud)

有没有人知道一个已经包含这样的东西的图书馆或一个pythonic的方式简明扼要地做而不改变原始列表?

Sra*_*raw 9

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

old = {"a": 1}
new_one = dict(old, new_key=value)
#or
new_one = dict(old, {...})
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一件事是它不会深度复制值,因此任何引用都将在两个字典之间共享。 (4认同)
  • @Hi-Angel 在 python 3 中,内部字典之前需要一个双星:`new_one = dict(old, **{...})`。但在 python 3.9 中,字典合并更容易,正如 syltruong 在另一个答案中所说 (4认同)
  • 此代码与 python 版本相关吗?在 python 3.9.0 中,评估 `dict({}, {1 : 3})` 会导致 `TypeError: dict Expected atmost 1 argument, got 2`。 (2认同)
  • @Hi-Angel 请注意您回复的答案如何使用关键字参数 (2认同)

syl*_*ong 6

从 Python 3.9 开始,您还可以使用Dictionary Merge 和 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}
Run Code Online (Sandbox Code Playgroud)