Python字典引用邻近字典元素
我正在尝试创建一个这样的东西:
dictionary = {
'key1': ['val1','val2'],
'key2': @key1
}
其中 @key1 是指向字典中 'key1' 这个键的内容。提前谢谢你。
2 个回答
4
使用一个新的类:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
注意这里的语法有点奇怪,因为你无法知道你是在哪个字典里面创建 DictRef
。
4
我想扩展一下Aaron Digulla的版本。他现在的内容在这里重复了一遍:
class DictRef(object):
def __init__(self, d, key): self.d, self.key = d, key
d = {}
d.update({
'key1': ['val1','val2'],
'key2': DictRef(d, 'key1')
})
我假设他希望实现真正的引用语义,这样访问 'key2'
时,总能找到 'key1'
的值。问题是,虽然 d['key1']
是一个 list
,但是 d['key2']
是一个 DictRef
。所以,要获取 'key1'
的“值”,你只需要用 d['key1']
,但对于 'key2'
,你必须用 d[d['key2'].key]
。而且,你不能有一个引用的引用,这样会变得很复杂,变成 d[d[d['key2'].key].key]
。那么,怎么区分一个引用和一个普通值呢?可能需要通过类型检查,比如用 isinstance(v, DictReference) 来判断 (ew)。
所以我有一个提议来解决这些问题。
就我个人而言,我不明白为什么真正的引用语义是必要的。如果看起来很必要,其实可以通过重新构建问题或解决方案来让它变得不必要。甚至可能根本就不需要,简单的 d.update(key2=d['key1'])
就能解决这个问题。
无论如何,接下来是我的提议:
class DictRef(object):
def __init__(self, d, key):
self.d = d
self.key = key
def value(self):
return self.d[self.key].value()
class DictVal(object):
def __init__(self, value):
self._value = value
def value(self):
return self._value
d = {}
d.update(
key1=DictVal(['val1', 'val2']),
key2=DictRef(d, 'key1')
)
现在,为了获取 任何 键的值,无论它是否是引用,只需用 d[k].value()
。如果有引用的引用,它们会正确地按顺序解引用。如果形成了一个非常长或无限的链,Python 会因为过度递归而报 RuntimeError 错误。