Печать ключей вложенных словарей в отсортированном порядке Python - PullRequest
0 голосов
/ 13 марта 2020

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

Определение задачи:

Напишите программу для отображения всех ключи «словаря словарей» (вложенный словарь) в отсортированном порядке

Итак, у меня есть что-то вроде

vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}}

и мне нужно распечатать все его ключи в отсортированном порядке , Теоретически я не знаю о модулях, поэтому я могу использовать только встроенные функции

По-моему, единственный способ, которым я могу придумать, - это использовать выходные данные функции vDict.keys() и разделить их регулярным выражением по порядку. сортировать значения. Но тогда я понятия не имею, как перебирать словари уровня 2.

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

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

Ответы [ 3 ]

3 голосов
/ 13 марта 2020

Подход oneliner

>>> sorted([k for v in vDict.values() if isinstance(v, dict) for k in v] + list(vDict))
[1, 5, 20, 39, 49, 65, 124, 9298, 9359]

Выделенная, чуть более читаемая версия

>>> def iterate_keys(d):
...     for k, v in d.items():
...         yield k
...         if isinstance(v, dict):
...             yield from v
...
>>> sorted(iterate_keys(vDict))
[1, 5, 20, 39, 49, 65, 124, 9298, 9359]

Если вы хотите обрабатывать словари с более глубоким вложением, вы можете изменить строку yield from v на yield from iterate_keys(v), чтобы посетить все уровни вложенности.

3 голосов
/ 13 марта 2020

Это должно сделать это:

def process(dd, keys):

    for key, val in dd.items():
        keys.append(key)
        if isinstance(val,dict):
            process(val, keys)

    return keys


vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}}

keys=[]
process(vDict, keys)
print(sorted(keys))
3 голосов
/ 13 марта 2020

Я думаю, это то, что вы ищете:

vDict={1:2942, 5:{20:231, 49:359, 65:429}, 39:{9359:2932, 9298:29328, 124:4}}
def get_keys(vDict):
    keys_list = []

    for k in vDict.keys():
        keys_list.append(k)
        if(type(vDict[k]) is dict):
            keys_list = keys_list + get_keys(vDict[k])
    return keys_list
new_list = get_keys(vDict)
new_list.sort()

Вывод:

[1, 5, 20, 39, 49, 65, 124, 9298, 9359]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...