我正在使用嵌套字典的复杂结构,我想使用一些以列表作为参数的函数。
有没有办法从字典中获取值列表,但保持两者的链接方式如果我修改另一个也会被修改?
让我举一个例子说明:
# I have this dictionary
d = {'first': 1, 'second': 2}
# I want to get a list like this
print(l) # shows [1, 2]
# I want to modify the list and see the changes reflected in d
l[0] = 23
print(l) # shows [23, 2]
print(d) # shows {'fist': 23, 'second': 2}
有没有办法实现类似的东西?
答案 0 :(得分:2)
您必须创建一个包装字典的自定义sequence object,将索引映射回键以访问get或set值:
from collections.abc import Sequence
class ValueSequence(Sequence):
def __init__(self, d):
self._d = d
def __len__(self):
return len(self._d)
def _key_for_index(self, index):
# try to avoid iteration over the whole dictionary
if index >= len(self):
raise IndexError(index)
return next(v for i, v in enumerate(self._d) if i == index)
def __getitem__(self, index):
key = self._key_for_index(index)
return self._d[key]
def __setitem__(self, index, value):
key = self._key_for_index(index)
self._d[key] = value
def __repr__(self):
return repr(list(self._d.values()))
该对象不支持删除,插入,追加或扩展。仅支持对现有字典值的操作。该对象也是 live ;如果您更改字典,该对象将直接反映这些更改。
演示:
>>> d = {'first': 1, 'second': 2}
>>> l = ValueSequence(d)
>>> print(l)
[1, 2]
>>> l[0] = 23
>>> print(l)
[23, 2]
>>> print(d)
{'first': 23, 'second': 2}
>>> d['second'] = 42
>>> l
[23, 42]
然而,这些并不一定有效。
继承Sequence
ABC会给你一些奖励方法:
>>> l.index(42)
1
>>> l.count(42)
1
>>> 23 in l
True
>>> list(reversed(l))
[42, 23]
考虑到词典无序;上述对象将直接反映对字典的更改,如果此类更改导致不同的排序,那么这将导致值的不同顺序。但是,如果您不添加或删除密钥,字典的顺序将保持稳定。