Словари Python: изменение порядка вложения - PullRequest
2 голосов
/ 02 июля 2010

У меня есть словарь с 300 парами ключ-значение, где каждый из ключей является целым числом, а значения - словарями с тремя парами ключ-значение.Все внутренние словари имеют одинаковые ключи, но разные значения.Все выглядит примерно так:

nested_dicts = 
{1: {'name1':88.4,
     'name2':22.1,
     'name3':115.7},
2:  {'name1':89.4,
     'name2':23.7,
     'name3':117.9}
...
300:{'name1':110.1,
     'name2':36.6,
     'name3':122.4}
 }

Если из приведенного выше примера структуры данных не ясно, этот вложенный словарь, вероятно, должен выглядеть следующим образом:

better_dict = 
{'name1': [88.4, 89.4, ..., 110.1],
 'name2': [22.1, 23.7, ..., 36.6],
 'name3': [115.7, 117.9, ..., 122.4]}

Я хотел бы сделать преобразование из nested_dicts в better_dict.

У меня проблемы с этим.Я подошел близко, но моя проблема заключается в попытке выяснить, как убедиться, что получающиеся списки находятся в правильном порядке.То есть порядок значений в списке должен соответствовать ключам во внешнем словаре исходного nested_dict.Кроме того, мой код использует циклы, но я чувствую, что это естественное применение генераторов / списков.Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 02 июля 2010

После настройки ввода введите:

>>> nested_dicts
{0: {'name2': 22.1, 'name3': 115.7, 'name1': 88.4},
 1: {'name2': 23.7, 'name3': 117.9, 'name1': 89.4},
 2: {'name2': 36.6, 'name3': 122.4, 'name1': 110.1}}
>>> for i in sorted(nested_dicts):
    for k, v in nested_dicts[i].items():
        if k not in n:
            n[k] = [None] * len(nested_dicts)
        n[k][i] = v

>>> n
defaultdict(<class 'list'>, {'name2': [22.1, 23.7, 36.6],
 'name3': [115.7, 117.9, 122.4], 'name1': [88.4, 89.4, 110.1]})

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

ETA : ваш запрос на сохранение порядка ключей потребует правильных индексов в вашем исходном nested_dict. То есть должна быть непрерывная последовательность, начинающаяся с 0.

3 голосов
/ 02 июля 2010

В python2.7 +

{n:[nested_dicts[i][n] for i in range(1,301)] for n in ["name1","name2","name3"]}

для python2.6

dict((n, [nested_dicts[i][n] for i in range(1,301)]) for n in ["name1","name2","name3"])

обратите внимание, что позиции в ваших списках индексируются с 0, а не с 1

...