返回除指定键之外的字典副本

Jui*_*icy 26 python dictionary dictionary-comprehension

我想创建一个函数,它返回一个字典的副本,不包括列表中指定的键.

考虑这个字典:

my_dict = {
    "keyA": 1,
    "keyB": 2,
    "keyC": 3
}
Run Code Online (Sandbox Code Playgroud)

致电without_keys(my_dict, ['keyB', 'keyC'])应该返回:

{
    "keyA": 1
}
Run Code Online (Sandbox Code Playgroud)

我想用一个整齐的字典理解一行来做这个,但我遇到了麻烦.我的尝试是这样的:

def without_keys(d, keys):
    return {k: d[f] if k not in keys for f in d}
Run Code Online (Sandbox Code Playgroud)

这是无效的语法.我怎样才能做到这一点?

mu *_*u 無 36

你很亲密,试试下面的片段:

>>> my_dict = {
...     "keyA": 1,
...     "keyB": 2,
...     "keyC": 3
... }
>>> invalid = {"keyA", "keyB"}
>>> def without_keys(d, keys):
...     return {x: d[x] for x in d if x not in keys}
>>> without_keys(my_dict, invalid)
{'keyC': 3}
Run Code Online (Sandbox Code Playgroud)

基本上,if k not in keys在上述情况下,意志理解将结束.

  • 是的,列表也足够了(你可以尝试一下),但通常当顺序对你来说不重要时,“set”是首选(即使从性能方面来看,这在这个只有一些数据的简短示例中并不重要)。 (2认同)

Ana*_*mar 16

在你的字典理解中你应该迭代你的字典(不k,不知道那是什么).示例 -

return {k:v for k,v in d.items() if k not in keys}
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个解决方案,因为它可以节省不调用“d[x]”索引操作的费用。 (2认同)

Mik*_*gel 12

甚至更短。显然 python 3 允许你list从 a 中“减去”a dict_keys

def without_keys(d, keys):
    return {k: d[k] for k in d.keys() - keys}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,使用 `keys()` 而不是 `items()` 会慢约 33%:https://discuss.python.org/t/copy-a-dictionary- except-some-keys/2559/5 (5认同)

Mor*_*app 7

这应该对你有用。

def without_keys(d, keys):
    return {k: v for k, v in d.items() if k not in keys}
Run Code Online (Sandbox Code Playgroud)