2016-10-03 4 views
0

Я пытаюсь определить свой обычный словарь как OrderedDict, но я не могу получить доступ к ключам, это внутренний уровень.Не удается получить доступ к под-ключам в OrderedDict

my_dict = \ 
{ 
    'key1': 
    { 
     'subkey1':value1, 
     'subkey2':value2 
    } 
} 

my_ordered_dict = OrderedDict\ 
([(
    'key1', 
    (
     ('subkey1',value1), 
     ('subkey2',value2) 
    ) 
)]) 

я могу получить доступ ['key1'] в обоих случаях, но я не могу получить доступ к ['key1']['subkey1'] для упорядоченного Dict.

Что я делаю неправильно?

+6

Значение в 'OrderedDict' не словарь, это кортеж кортежей. Если вы хотите, чтобы это был другой «OrderedDict», вам нужно будет сделать это явно. – jonrsharpe

ответ

1

Словарь с 'subkey1' также должен быть определен как OrderedDict, если это то, что вы хотите. Так оно и должно быть что-то вроде этого

import collections 
my_ordered_dict = collections.OrderedDict() 
sub_dict=collections.OrderedDict() 
sub_dict['subkey1']=1 
sub_dict['subkey2']=2 
my_ordered_dict['key1']=sub_dict 
sub_dict=collections.OrderedDict() 
sub_dict['subkey1']=3 
sub_dict['subkey2']=4 
my_ordered_dict['key2']=sub_dict 
print my_ordered_dict['key1']['subkey1'] 
print my_ordered_dict['key2']['subkey1'] 

из положить будет

1 
3 
0

Если вы хотите, чтобы внутренний уровень, чтобы также быть OrderedDict вам нужно явно определить его как единое целое. Поскольку порядок аргументов имеет значение при построении OrderedDict s, для его сохранения вам необходимо передать ключи и значения в виде пары key, value, как показано в разделе документации OrderedDict Examples and Recipes.

Применяя, что ваш пример означает, что вы должны сделать что-то вроде следующего:

from collections import OrderedDict 

value1, value2 = 42, 69 

my_ordered_dict = OrderedDict([ 
        ('key1', OrderedDict([ 
           ('subkey1', value1), 
           ('subkey2', value2) 
          ]) 
        ) 
        ]) 

print(my_ordered_dict['key1']['subkey1']) # --> 42 
Смежные вопросы