2012-07-13 111 views
3

我想创建一个“转换器”类型的dict,它将赋值为嵌套的不同字符中的键,并将其转换为我创建的字典中的键。我遇到的问题是,我无法创建一个代表嵌套字典密钥的值,而无需将其转换为字符串或其他数据类型,并且当我尝试将字符串用作嵌套字典的索引时,我收到一个索引错误。理想情况下,我的字典会是这个样子:在python中使用dict键作为不同字典中的值

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'] 
    } 

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

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

嵌套类型的字典是非常大的我只需要从每个字段中选择几个字段,否则我可以使用.copy()函数来处理旧的字典。

PS-任何帮助改写这个问题更可读性也值得赞赏。

+0

当你说'[ 'subdict1'] [ 'subdict2'] [ 'old_key_1']'你的意思是像一个嵌套字典 - >'{'subdict1':{'subdict2':'old_key_1'}}'或者一系列的字典?我没有那么好。如果你可以发布为什么你想要这样做,我们可以以不同的方式帮助你(也许更简单的方法)来处理你的问题 – Hassek 2012-07-13 16:53:44

+0

是的,它是一个嵌套的字典,但old_key_1是一个键 - 就像{'subdict1':{subdict2:{ old_key_1:some_value,old_key_2:some_other value}}}。它实际上是一个在Python中转换为字典的JSON-rpc对象。 – paulski 2012-07-13 19:51:43

回答

4

你会需要reduce()这一个...

attrmap = { 
    "new_key_1": ('subdict1', 'subdict2', 'old_key_1'), 
    ... 
} 

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

不错的答案。我赞成它。 – DevPlayer 2012-07-13 17:09:59

+0

Ignacio,你能详细解释一下这个答案吗?我试图让这个代码工作,但我不断收到一个AttributeError:dict对象没有属性'subdict1'。 – paulski 2012-07-13 20:20:03

+0

Pfft。那是因为我搞砸了。 – 2012-07-13 20:23:34

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']] 
相关问题