#python #python-3.x
#python #python-3.x
Вопрос:
У меня есть список словарей, которые сами содержат вложенные списки словарей. К счастью, все уровни вложенности имеют схожую структуру. Я хочу отсортировать эти вложенные списки словарей. Я понимаю технику сортировки списка словарей по значению. Я борюсь с рекурсией, которая сортирует внутренние списки.
def reorder(l, sort_by):
# I have been trying to add a recursion here
# so that the function calls itself for each
# nested group of "children". So far, fail
return sorted(l, key=lambda k: k[sort_by])
l = [
{ 'name': 'steve',
'children': [
{ 'name': 'sam',
'children': [
{'name': 'sally'},
{'name': 'sabrina'}
]
},
{'name': 'sydney'},
{'name': 'sal'}
]
},
{ 'name': 'fred',
'children': [
{'name': 'fritz'},
{'name': 'frank'}
]
}
]
print(reorder(l, 'name'))
Ответ №1:
def reorder(l, sort_by):
l = sorted(l, key=lambda x: x[sort_by])
for item in l:
if "children" in item:
item["children"] = reorder(item["children"], sort_by)
return l
Ответ №2:
Поскольку вы заявляете: «Я понимаю технику сортировки списка словарей по значению», я опубликую некоторый код для рекурсивного сбора данных из другого сообщения SO, которое я сделал, и предоставлю вам реализовать вашу технику сортировки. Код:
myjson = {
'transportation': 'car',
'address': {
'driveway': 'yes',
'home_address': {
'state': 'TX',
'city': 'Houston'}
},
'work_address': {
'state': 'TX',
'city': 'Sugarland',
'location': 'office-tower',
'salary': 30000}
}
def get_keys(some_dictionary, parent=None):
for key, value in some_dictionary.items():
if '{}.{}'.format(parent, key) not in my_list:
my_list.append('{}.{}'.format(parent, key))
if isinstance(value, dict):
get_keys(value, parent='{}.{}'.format(parent, key))
else:
pass
my_list = []
get_keys(myjson, parent='myjson')
print(my_list)
Предназначен для рекурсивного извлечения всех ключей из файла json. Выводит:
['myjson.address',
'myjson.address.home_address',
'myjson.address.home_address.state',
'myjson.address.home_address.city',
'myjson.address.driveway',
'myjson.transportation',
'myjson.work_address',
'myjson.work_address.state',
'myjson.work_address.salary',
'myjson.work_address.location',
'myjson.work_address.city']
Главное, что следует отметить, это то, что if isinstance(value, dict):
приводит к get_keys()
повторному вызову, отсюда и его рекурсивные возможности (но в данном случае только для вложенных словарей).