在Python中将字典键用作不同字典中的值

3
我希望创建一个“翻译器”类型的字典,它可以将不同嵌套字典中的键值分配给我创建的字典中的键。然而,我遇到的问题是,我无法创建一个表示嵌套字典键的值,而不必将其转换为字符串或其他数据类型。当我尝试将字符串用作索引到嵌套的字典时,会出现索引错误。理想情况下,我的字典应该像这样:
new_dict{
    "new_key_1" : ['subdict1']['subdict2']['old_key_1'],
    "new_key_2" : ['subdict1']['subdict2']['old_key_2'],
    "new_key_3" : ['subdict1']['subdict3']['old_key_3']
    }

然后,对于每个嵌套的字典,我可以使用简单的for循环生成一个新的字典对象:

for key, value in new_dict.items() :
    user_dict_1[key] = OldDict[value]

嵌套字典非常大,我只需要从每个字典中获取少数字段,否则我可以使用.copy()函数处理旧字典。
附注:如果能够重写这个问题以使其更易读,也将不胜感激。

当你说 ['subdict1']['subdict2']['old_key_1'] 时,你是指像嵌套字典一样 --> {'subdict1': {'subdict2': 'old_key_1'}} 还是一个字典列表?我对这部分理解得不太好。如果你能说明为什么要这样做,我们可能可以帮助你以不同的方式(也许更简单的方式)来处理你的问题。 - Hassek
是的,它是一个嵌套字典,但old_key_1是一个键 - 就像 {'subdict1': {subdict2: {old_key_1 : some_value, old_key_2 : some_other value}}}。实际上,它是一个在Python中转换为字典的JSON-rpc对象。 - paulski
2个回答

4
你需要用到reduce()来完成这个任务...
attrmap = {
  "new_key_1": ('subdict1', 'subdict2', 'old_key_1'),
   ...
}

print reduce(lambda x, y: x[y], attrmap[somekey], old_object)

Ignacio,你能详细解释一下这个答案吗?我已经尝试让这段代码工作了,但是我一直收到一个AttributeError:dict对象没有'subdict1'属性。 - paulski
呃,那是因为我搞砸了。 - Ignacio Vazquez-Abrams

0
你是在说这样的东西吗?
from pprint import pprint as pp
subdict1 = {'subdict1_item1':1, 'subdict1_item2':2}
subdict2 = {'subdict2_item1':3, 'subdict2_item2':4}
subdict3 = {'subdict3_item1': 5, 'subdict3_item1':6}
olddict = {
    'old_key_1': [subdict1, subdict2],
    'old_key_2': [subdict1, subdict2],
    'old_key_3': [subdict1, subdict3],
    }

newdict = {
    'new_key_1': olddict['old_key_1'].append('old_key_1'),
    'new_key_2': olddict['old_key_2'].append('old_key_2'),
    'new_key_3': olddict['old_key_3'].append('old_key_3'),
    }

或者这个

newdict = {
    'new_key_1': 'old_key_1',
    'new_key_2': 'old_key_2',
    'new_key_3': 'old_key_3',
    }
def getnew(newkey, newdict, olddict):
    if newkey in newdict:
        oldkey = newdict[newkey]
        if oldkey in olddict:
            preitem = olddict[ oldkey ] # returns a list with two items
            item = []
            item.append([preitem[0]]) # makes subdict1 wrapped in a list
            item.append([preitem[1]]) # makes subdict2/3 wrapped in a list
            item.append([oldkey])
            return item
        else:
            raise KeyError('newdict has no matching olddict key')

结果为:

pp( getnew('new_key_1', newdict, olddict) )
print 
pp( getnew('new_key_2', newdict, olddict) )
print
pp( getnew('new_key_3', newdict, olddict) )
[[{'subdict1_item1': 1, 'subdict1_item2': 2}],
 [{'subdict2_item1': 3, 'subdict2_item2': 4}],
 ['old_key_1']]

[[{'subdict1_item1': 1, 'subdict1_item2': 2}],
 [{'subdict2_item1': 3, 'subdict2_item2': 4}],
 ['old_key_2']]

[[{'subdict1_item1': 1, 'subdict1_item2': 2}],
 [{'subdict3_item1': 6}],
 ['old_key_3']]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接