按值对嵌套字典列表进行递归排序

2024-10-01 11:25:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个字典列表,它们本身有嵌套的字典列表。谢天谢地,所有的巢层都有相似的结构。我想对这些嵌套的词典列表进行排序。我掌握了按值对词典列表排序的技巧。我正在努力使用递归来对内部列表进行排序。你知道吗

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'))

Tags: name列表技巧by字典排序defhave
2条回答
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

由于您声明“我掌握了按值对字典列表排序的技术”我将发布一些代码,用于递归地从我发布的另一篇文章中收集数据,并将其留给您来实现排序技术。代码:

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()再次被调用,因此它具有递归功能(但在本例中仅适用于嵌套字典)。你知道吗

相关问题 更多 >