python – 没有副作用嵌套字典实现
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 没有副作用嵌套字典实现,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1926字,纯文字阅读大概需要3分钟。
内容图文
![python – 没有副作用嵌套字典实现](/upload/InfoBanner/zyjiaocheng/799/682fd77adcbf402dbcc9d03729516187.jpg)
我在SO上遇到过至少两个体面的嵌套字典实现,一个是to use defaultdict,另一个是to subclass dict.
这两种方法对于大多数功能都可以正常工作,除了它们在访问不存在的键值对时都有副作用:它为该键创建一个空字典,存储并返回它.
理想情况下,我希望在尝试访问不存在的密钥时,在不创建条目(例如空字典)的情况下返回None的实现.这可行吗?
附:我知道我们可以通过使用元组作为键来避免嵌套字典,但是这个实现不起作用,因为我需要访问嵌套字典的每个级别的条目集合.
解决方法:
如果您希望d [key] [subkey] = value可以使用缺少的键,则必须放弃返回None的要求.如果d [key]为None,则d [key] [subkey] = value等于None [subkey] = value,这不起作用.
使用缺失值可以做的是返回一个空的类似dict的对象,而不是将它分配给一个键.如果该对象持有对父对象的引用,则可以延迟赋值,直到在层次结构中有明确的赋值.
一个示例实现(这是不完整的,您必须做的不仅仅是覆盖setitem以拥有一个功能齐全的dict子类):
class NestedDict(dict):
def __init__(self, parent=None, parentkey=None):
self.parent = parent
self.parentkey = parentkey
def __missing__(self, key):
return NestedDict(self, key)
def __setitem__(self, key, value):
if self.parent is not None:
self.parent[self.parentkey] = self
self.parent = None
super(NestedDict, self).__setitem__(key, value)
>>> d = NestedDict()
>>> d[1][2][3] = 4
>>> d[2]
{}
>>> d.keys()
[1]
>>> d[1][2][3]
4
另一种方法是在键是元组时覆盖__getitem__和__setitem__来执行嵌套查找.此版本为__getitem__提供了KeyError,用于缺少键,以便与常规dict保持一致.如果您愿意,可以轻松更改它以返回None.
class NestedDict(dict):
def __getitem__(self, key):
if isinstance(key, tuple):
try:
x = self
for k in key:
x = x[k]
return x
except (KeyError, TypeError):
raise KeyError(key)
else:
return super(NestedDict, self).__getitem__(key)
def __setitem__(self, key, value):
if isinstance(key, tuple):
d = self
for k in key[:-1]:
d = d.setdefault(k, NestedDict())
d[key[-1]] = value
else:
super(NestedDict, self).__setitem__(key, value)
>>> d = NestedDict()
>>> d[1,2,3] = 4
>>> d[1,2,3]
4
>>> d[1,2,4]
KeyError: (1, 2, 4)
>>> d
{1: {2: {3: 4}}}
内容总结
以上是互联网集市为您收集整理的python – 没有副作用嵌套字典实现全部内容,希望文章能够帮你解决python – 没有副作用嵌套字典实现所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。