Сортировка вложенных словарей по второму ключу - PullRequest
0 голосов
/ 20 марта 2019

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

my_dictionary = {
    "char": {
        "3": {
            "genman": [
                "motion"
            ]
        }
    }, 
    "fast": {
        "2": {
            "empty": []
        }
    }, 
    "EMPT": {
        "0": {}
    }, 
    "veh": {
        "1": {
            "tankers": [
                "varA", 
                "varB"
            ]
        }
    }
}

И мой ожидаемый результат будет:

my_dictionary = {
    "EMPT": {
        "0": {}
    }, 
    "veh": {
        "1": {
            "tankers": [
                "varA", 
                "varB"
            ]
        }
    },
    "fast": {
        "2": {
            "empty": []
        }
    },
    "char": {
        "3": {
            "genman": [
                "motion"
            ]
        }
    }
}

Попробовал с помощью следующегоcode:

new_dict = {}
for k, v in my_dictionary.items():
    for s in sorted(my_dictionary.itervalues()):
        if not s.keys()[0]:
            new_val = my_dictionary[k].get(s.keys()[0])
            my_dictionary[s.keys()[0]] = new_val
            my_dictionary.update(new_dict)

Неудачно, и я получаю тот же результат, что и мой первоначальный словарь.

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Это работает:

sorted(my_dictionary.items(), key=lambda x: list(x[1].keys())[0])

Возвращает:

[('EMPT', {'0': {}}),
 ('veh', {'1': {'tankers': ['varA', 'varB']}}),
 ('fast', {'2': {'empty': []}}),
 ('char', {'3': {'genman': ['motion']}})]

Sorted получает список пар ключ-значение, мы сортируем, используя результат lambda x: list(x[1].keys())[0], который принимает список ключей во внутреннем dict, а затем захватывает первый ключ (необходимо сделать это, потому что dict_keys напрямую не индексируется ).

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

1 голос
/ 20 марта 2019

на самом деле нет ордера на диктовку, однако вместо этого вы можете использовать OrderedDIct.

from collections import OrderedDict
my_dictionary = {
    "char": {
        "3": {
            "genman": [
                "motion"
            ]
        }
    }, 
    "fast": {
        "2": {
            "empty": []
        }
    }, 
    "EMPT": {
        "0": {}
    }, 
    "veh": {
        "1": {
            "tankers": [
                "varA", 
                "varB"
            ]
        }
    }
}
s = sorted((list(v.keys())[0], k) for k, v in my_dictionary.items())
new_dic = OrderedDict([(k,my_dictionary[k]) for _, k in s])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...