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

3

Я хотел бы создать & 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 - Любая помощь в переписывании этого вопроса, чтобы быть более читабельным, также приветствуется.

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

Ваш Ответ

2   ответа
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']]
4

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

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

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

Похожие вопросы