这是嵌套字典的样子:
mydict = {
'a1':{
'x': 1,
'y': 2
},
'a2':{
'x':3,
'y':4
}
}
我正在尝试在字典z
和a1
中添加新键a2
,以使新键包含键x
的值。
当前,我正在使用这种方法:
for key in mydict:
mydict[key]['z'] = mydict[key]['x']
还有其他方法吗?
答案 0 :(得分:3)
循环方法没问题。您可以更加简洁地直接遍历内部字典:
for d in mydict.values():
d['z'] = d['x']
答案 1 :(得分:2)
您可以创建自己的zdict
类!如果您确定字典将在初始化时获得一个x
键,则可以在z
处设置__init__
。否则,您可以设计自己的__getitem__
方法,使其表现出所需的效果。我提供了两种解决方案。
class zdict(dict):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self['z'] = self['x']
class zdict2(dict):
def __getitem__(self, item):
if item == 'z':
return super().__getitem__('x') # note that you can't modify the value of "z" anymore in that implementation but you can figure something to change that
else:
return super().__getitem__(item)
mydict = {
'a1': zdict(
x=1,
y=2
),
'a2':zdict(
x=3,
y=4
),
}
print(mydict['a1']['z'], mydict['a1']['x'])
print(mydict['a2']['z'], mydict['a2']['x'])
mydict2 = {
'a1': zdict2(
x=1,
y=2
),
'a2':zdict2(
x=3,
y=4
),
}
print(mydict2['a1']['z'], mydict2['a1']['x'])
print(mydict2['a2']['z'], mydict2['a2']['x'])
答案 2 :(得分:0)
EDIT1 :这里没有争论效率,因为我没有对这两种解决方案进行基准测试!
EDIT2::如果要保留键'x'
,请使用:
mydict = { k: {'z': v['x'], **v} for k, v in mydict.items() }
虽然我认为它更像pythonic,但没有您的解决方案更具可读性:
mydict = { k: {'z': v.pop('x'), **v} for k, v in mydict.items() }