返回不包括指定键的字典副本
Posted
技术标签:
【中文标题】返回不包括指定键的字典副本【英文标题】:Return copy of dictionary excluding specified keys 【发布时间】:2015-10-04 16:55:52 【问题描述】:我想创建一个函数,它返回字典的副本,不包括列表中指定的键。
考虑这本字典:
my_dict =
"keyA": 1,
"keyB": 2,
"keyC": 3
对without_keys(my_dict, ['keyB', 'keyC'])
的调用应该返回:
"keyA": 1
我想用简洁的字典理解在一行中执行此操作,但我遇到了麻烦。我的尝试是这样的:
def without_keys(d, keys):
return k: d[f] if k not in keys for f in d
这是无效的语法。我该怎么做?
【问题讨论】:
【参考方案1】:你的单线器
my_dict = "keyA": 1, "keyB": 2, "keyC": 3
(lambda keyB, keyC, **kw: kw)(**my_dict)
返回'keyA': 1
。
不是很 Pythonic 和动态,但是 hacky 和简短。
它使用函数参数的 dict 解包(解构赋值)。
另请参阅 https://***.com/a/53851069/11769765.
【讨论】:
【参考方案2】:您可以将此概括为嵌套字典解决方案
def copy_dict(data, strip_values=False, remove_keys=[]):
if type(data) is dict:
out =
for key, value in data.items():
if key not in remove_keys:
out[key] = copy_dict(value, strip_values=strip_values, remove_keys=remove_keys)
return out
else:
return [] if strip_values else data
这种递归解决方案适用于嵌套字典,并从整个嵌套结构中删除不需要的键。它还使您能够返回只有键而没有值的嵌套。
【讨论】:
【参考方案3】:甚至更短。显然,python 3 可以让您从 dict_keys
中“减去”list
。
def without_keys(d, keys):
return k: d[k] for k in d.keys() - keys
【讨论】:
请注意,使用keys()
而不是 items()
会慢约 33%:discuss.python.org/t/copy-a-dictionary-except-some-keys/2559/5【参考方案4】:
对于那些不喜欢列表推导的人,这是我的版本:
def without_keys(d, *keys):
return dict(filter(lambda key_value: key_value[0] not in keys, d.items()))
用法:
>>> d=1:3, 5:7, 9:11, 13:15
>>> without_keys(d, 1, 5, 9)
13: 15
>>> without_keys(d, 13)
1: 3, 5: 7, 9: 11
>>> without_keys(d, *[5, 7])
1: 3, 13: 15, 9: 11
【讨论】:
【参考方案5】:你很接近,试试下面的sn-p:
>>> 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
基本上,if k not in keys
在上述情况下会出现在字典理解的末尾。
【讨论】:
您声明无效的集合。这有什么原因吗?一个列表也足够了吗? 是的,list 也足够了(你可以试试),但通常当顺序对你来说不重要时,set
是首选(即使从性能方面来看,这在这个简短的例子中并不重要只需少量数据)。
这是否比获取所有键然后使用 for 循环手动跳过不需要的键更快?【参考方案6】:
在您的字典理解中,您应该遍历您的字典(不是 k
,也不确定那是什么)。示例 -
return k:v for k,v in d.items() if k not in keys
【讨论】:
我更喜欢这个解决方案,因为它可以(微小)节省不调用d[x]
索引操作。
虽然这是一个浅拷贝【参考方案7】:
这应该适合你。
def without_keys(d, keys):
return k: v for k, v in d.items() if k not in keys
【讨论】:
以上是关于返回不包括指定键的字典副本的主要内容,如果未能解决你的问题,请参考以下文章