创建一个新键并在嵌套字典中分配现有键的值

时间:2020-04-23 06:01:18

标签: python python-3.x dictionary

这是嵌套字典的样子:

mydict = {
    'a1':{
        'x': 1,
        'y': 2
    },
    'a2':{
        'x':3,
        'y':4
    }
}

我正在尝试在字典za1中添加新键a2,以使新键包含键x的值。

当前,我正在使用这种方法:

for key in mydict:
  mydict[key]['z'] = mydict[key]['x']

还有其他方法吗?

3 个答案:

答案 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() }