Есть ли быстрый способ изменить этот вид словаря? - PullRequest
1 голос
/ 22 декабря 2011

У меня есть такой диктат со следующей структурой данных:

{'index_1':[('time_1',[ ['a',1],['b',1],['c',1] ]),
            ('time_2',[ ['a',100],['c',100] ]),
            ('time_3',[ ['a',200],['b',200],['c',200] ]),
            ('someting_time', [ ['something_name','something_val'] ... ])
           ],
 'index_2':['something same as above' ]
}

Это в основном индексируется с помощью 'time_x'.Но я действительно хочу изменить диктат на следующий стиль:

{'index_1':{'a':{'time_1':1,'time_2':100,'time_3':200},
            'b':{'time_1':1,'time_2':'NO_VAL','time_3",200},
             .... 
             ....
}

Есть ли какой-нибудь быстрый способ сделать это изменение?Я могу просмотреть каждый список / дикт, но мне нужно учитывать производительность или хорошую структуру данных из-за более одинаковых действий поиска.

Спасибо

1 Ответ

1 голос
/ 22 декабря 2011

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

Вот небольшой фрагмент кода, чтобы сделать то, что вы просили. Он не выполняет NO_VAL, но если time_x там нет, вы можете сделать попытку, кроме KeyError, довольно легко.

#
a={'index_1':[('time_1',[ ['a',1],['b',1],['c',1] ]),('time_2',[ ['a',100],['c',100] ]),('time_3',[ ['a',200],['b',200],['c',200] ])],'index_2':[('time_1',[ ['a',1],['d',1],['c',1] ]),('time_2',[ ['a',100],['c',100] ]),('time_3',[ ['a',200],['b',200],['c',200] ])]}

d={}

for key in a.keys():
    d[key]={}
    for time in a[key]:
        for name in time[1]:
            if name[0] in d[key]:
        d[key][name[0]][time[0]]=name[1]
            else:
                d[key][name[0]]={time[0]:name[1]}


print d
#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...