Использование ключей dict в python в качестве значений в другом dict

Я хотел бы создать & quot; переводчик & quot; тип dict, который бы назначал значения, которые являются ключами в разных dicts, которые являются вложенными, для ключей в dict, который я создал. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу создать значение, представляющее вложенный ключ dict, без необходимости преобразовывать его в строку или какой-либо другой тип данных, и когда я пытаюсь использовать строку в качестве индекса для вложенного 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 я могу сгенерировать новый объект dict с простым циклом for:

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

Вложенные дикты очень велики, и мне нужно всего несколько полей для каждого, иначе я мог бы просто использовать функцию .copy () для работы со старыми диктами.

PS - Любая помощь в переписывании этого вопроса, чтобы быть более читабельным, также приветствуется.

 paulski13 июл. 2012 г., 21:51
Да, это вложенный dict, но old_key_1 - это ключ - как {'subdict1': {subdict2: {old_key_1: some_value, old_key_2: some_other value}}}. На самом деле это объект JSON-rpc, преобразованный в dict в Python.
 Hassek13 июл. 2012 г., 18:53
когда ты сказал['subdict1']['subdict2']['old_key_1'] Вы имеете в виду, как вложенный диктат - & gt;{'subdict1': {'subdict2': 'old_key_1'}} или список диктов? Я не получил эту часть очень хорошо. Если вы можете сообщить, почему вы хотите сделать это, мы можем помочь вам различными способами (возможно, более простыми способами) решить вашу проблему

Ответы на вопрос(2)

Решение Вопроса

reduce() для этого ...

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

print reduce(lambda x, y: x[y], attrmap[somekey], old_object)
 13 июл. 2012 г., 19:09
Необычный хороший ответ. Я приветствую это.
 paulski13 июл. 2012 г., 22:20
Игнасио, не могли бы вы подробнее остановиться на этом ответе? Я пытался заставить этот код работать, но я продолжаю получать объект AttributeError: dict не имеет атрибута "subdict1".
 13 июл. 2012 г., 22:23
Пфф. Это потому что я облажался.
 paulski14 июл. 2012 г., 01:26
Очень хороший код, спасибо.

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

Ваш ответ на вопрос