gpt4 book ai didi

python - 如何使用元组访问深度嵌套的字典?

转载 作者:太空狗 更新时间:2023-10-30 01:09:15 31 4
gpt4 key购买 nike

我想扩展 the autovivification example在之前的回答中给出 nosklo允许通过元组访问字典。

nosklo 的解决方案如下所示:


class AutoVivification(dict):
"""Implementation of perl's autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value

测试:

a = AutoVivification()

a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6

print a

输出:

{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}

我有一个例子,我想给定一些任意的下标元组来设置一个节点。如果我不知道元组会有多少层,我该如何设计一种方法来设置合适的节点?

我在想也许我可以使用如下语法:

mytuple = (1,2,3)
a[mytuple] = 4

但是我在想出一个可行的实现时遇到了麻烦。


更新

我有一个基于@JCash 回答的完整示例:

class NestedDict(dict):
"""
Nested dictionary of arbitrary depth with autovivification.

Allows data access via extended slice notation.
"""
def __getitem__(self, keys):
# Let's assume *keys* is a list or tuple.
if not isinstance(keys, basestring):
try:
node = self
for key in keys:
node = dict.__getitem__(node, key)
return node
except TypeError:
# *keys* is not a list or tuple.
pass
try:
return dict.__getitem__(self, keys)
except KeyError:
raise KeyError(keys)
def __setitem__(self, keys, value):
# Let's assume *keys* is a list or tuple.
if not isinstance(keys, basestring):
try:
node = self
for key in keys[:-1]:
try:
node = dict.__getitem__(node, key)
except KeyError:
node[key] = type(self)()
node = node[key]
return dict.__setitem__(node, keys[-1], value)
except TypeError:
# *keys* is not a list or tuple.
pass
dict.__setitem__(self, keys, value)

使用扩展切片符号可以实现与上面相同的输出:

d = NestedDict()
d[1,2,3] = 4
d[1,3,3] = 5
d[1,2,'test'] = 6

最佳答案

这似乎可行

def __setitem__(self, key, value):
if isinstance(key, tuple):
node = self
for i in key[:-1]:
try:
node = dict.__getitem__(node, i)
except KeyError:
node = node[i] = type(self)()
return dict.__setitem__(node, i, value)
return dict.__setitem__(self, key, value)

关于python - 如何使用元组访问深度嵌套的字典?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077973/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com