Сортировка вложенных словарей по второму ключу

#python #dictionary #dictionary-comprehension

#python #словарь #понимание словаря

Вопрос:

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

 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"
            ]
        }
    }
}
  

Пытался использовать следующий код:

 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)
  

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

Комментарии:

1. Попробуйте использовать OrderedDict

Ответ №1:

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

 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, чтобы использовать его как dict.

Ответ №2:

на самом деле для dict нет порядка, однако вместо этого вы можете использовать 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])
  

Комментарии:

1. ответ @solarc, я думаю, лучше.