如何在两个对象之间建立实时连接

时间:2014-08-08 03:38:16

标签: python

我声明了两个变量。第一个是字典。第二个是列表(它是字典'.values()'方法的输出)。

dictVar={'one':1,'two':2,'three':3}
listVar=dictVar.values()

此时listVar的内容准确地表示存储在字典dictVar中的每个值 稍后在代码的某处,字典将使用新值进行更新:

dictVar['four']=4

现在listVar的内容已“过时”。它不代表存储在字典中的每个值。 为了保持列表更新,我必须手动添加一个新值,例如:

dictVar['four']=4
listVar.append(4)

我想知道是否有办法在列表变量和字典之间建立“实时”更新。因此,每次更改字典时,列表也会更新。

2 个答案:

答案 0 :(得分:4)

使用dictionary view object

>>> 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__函数来完成类的功能。可以在文档中找到更多信息:

https://docs.python.org/2/reference/datamodel.html