映射多个Python dict中的值



假设我有2"空";dicts:

keys_in = ["in1","in2"]
dict2 ={key: None for key in keys_in}
keys_out = ["out1","out2"]
dict3 ={key: None for key in keys_out}

我想";地图";dict到另一个的值之一:

dict3["out1"] = dict2["in1"]

因此,如果设置了dict2["in1"]的值,我在dict3["out1"]中得到相同的值

这可能吗?尝试了这个,值没有改变:

keys_in = ["in1","in2"]
dict2 ={key: None for key in keys_in}
keys_out = ["out1","out2"]
dict3 ={key: None for key in keys_out}
dict3["out1"] = dict2["in1"]
dict2["in1"]  = 4
print(dict3["out1"]) #keeps being None
print(dict2["in1"]) # this of course  is 4

我在思考C++指针时产生了这个想法,我不确定我是否朝着正确的方向前进:s

不,这不是Python中赋值的工作方式。请看这个或读这个。tl;dr:名称是独立重新分配的

在没有任何进一步上下文的情况下,可以创建一个可变对象,并在两个dict的值中使用它。我从来没有见过这样的用例,我们可能正在处理XY问题,但一个例子可能很有教育意义。

class MutableValue:
def __init__(self, value):
self.value = value
def __repr__(self):
return repr(self.value)

演示:

>>> dict1 = {'in1': MutableValue(4)}
>>> dict2 = {'out1': dict1['in1']}
>>> dict1
{'in1': 4}
>>> dict2
{'out1': 4}
>>> dict1['in1'].value = 5
>>> dict1
{'in1': 5}
>>> dict2
{'out1': 5}

只是为了好玩,我们可以更进一步:

from collections import UserDict
class MutableValueDict(UserDict):
def __setitem__(self, key, item):
if key in self:
self[key].value = item
else:
super().__setitem__(key, MutableValue(item))  

演示:

>>> dict1 = MutableValueDict({'in1': 4})
>>> dict2 = MutableValueDict({'out1': dict1['in1']})
>>> dict1
{'in1': 4}
>>> dict2
{'out1': 4}
>>> dict1['in1'] = 5 # no need to access .value
>>> dict1
{'in1': 5}
>>> dict2
{'out1': 5}

要获得类似的结果,一个棘手的方法是为依赖字典dict3的每个值设置一个可调用函数,该函数可以访问存储在原始字典dict2中的值。当drawbrack访问dict3中的值时,应该取消一个空调用,即dict3['out1']()

自然假设:两本词典的词条数量相同(顺序正确)。

# default initialisation
keys_in = ["in1","in2"]
dict2 = dict.fromkeys(keys_in, None)
# create a dictionary with callable values
keys_out = ["out1","out2"]
dict3 = {k3: lambda: dict2[k2] for k2, k3 in zip(keys_in, keys_out)}
# check content
print(dict3['out1']())
# add content to first dict
dict2['in1'] = 'dict2 -> in1'
dict2['in2'] = 'dict2 -> in2'
# check the updates
print(dict3['out1']())
#'dict2 -> in1'
print(dict3['out2']())
#'dict2 -> in2'

这里有一种访问dict3值的函数编程方法,只是为了强调它的所有值都是可调用的:

from operator import methodcaller
vs = list(map(methodcaller('__call__'), dict3.values()))
print(vs)

相关内容

  • 没有找到相关文章

最新更新