我声明了两个变量。第一个是字典。第二个是列表(它是字典'.values()'方法的输出)。
dictVar={'one':1,'two':2,'three':3}
listVar=dictVar.values()
此时listVar
的内容准确地表示存储在字典dictVar
中的每个值
稍后在代码的某处,字典将使用新值进行更新:
dictVar['four']=4
现在listVar
的内容已“过时”。它不代表存储在字典中的每个值。
为了保持列表更新,我必须手动添加一个新值,例如:
dictVar['four']=4
listVar.append(4)
我想知道是否有办法在列表变量和字典之间建立“实时”更新。因此,每次更改字典时,列表也会更新。
答案 0 :(得分:4)
>>> dictVar={'one':1,'two':2,'three':3}
>>> listVar=dictVar.viewvalues()
>>> listVar
dict_values([3, 2, 1])
>>> dictVar['one']=100
>>> listVar
dict_values([3, 2, 100])
>>> dictVar['four']=4
>>> listVar
dict_values([4, 3, 2, 100])
>>> list(listVar)==dictVar.values()
True
答案 1 :(得分:1)
你可以做的就是创建一个自定义类,作为字典的包装器。每当您致电obj[key] = val
时,您都会隐式调用该对象的__setitem__(self, key, val)
方法。创建自定义类时,可以覆盖此方法以使用它执行您喜欢的操作(即更新关联列表)。
这是一个示例类包装器:
class EnhancedDict(object):
def __init__(self): # The constructor
self.dictVar = {} # Your dictionary
self.listVar = [] # Your list
def __getitem__(self, key): # Equivalent to obj[key]
return self.dictVar[key]
def __setitem__(self, key, val) # Equivalent to obj[key] = val
self.dictVar[key] = val
self.listvar.append(val)
每当您向字典添加新项目时,列表会自动更新,您可以轻松完成:
>>> dict_obj = EnhancedDict()
>>> dict_obj["foo"] = "bar" # Automatically updates both the list and the dict
>>> dict_obj["foo"]
'bar'
>>> dict_obj.dictVar
{'foo': 'bar'}
>>> dict_obj.listVar
['bar']
还可以覆盖__delitem__
函数来完成类的功能。可以在文档中找到更多信息: