Python3 使用 lambda 对嵌套字典的列表进行排序

标签 python python-3.x sorting lambda hash

我有一个由各种列表和字典组成的深层嵌套对象,我将其作为 json 检索,我需要将其与自身的另一个版本进行比较。问题是所有列表基本上都是未排序的,因此我需要在比较它们之前进行排序。我尝试过的任何深度差异库都在没有对列表中的字典位置进行正确排序的情况下失败了,所以我们开始吧。

需要排序的示例对象:

{
    "main":{
        "key1":"value1",
        "key2":"value2",
        "key3":[{
            "sub1":"value2",
            "sub2":{
                "subsub":[{
                    "subsubsub1":10,
                    "subsubsub2":11,
                    "subsubsub3":[10,11,12]
                },{
                    "subsubsub1":7,
                    "subsubsub2":8,
                    "subsubsub3":[9,7,8]
                }]
            }
        },{
            "sub1":"value1",
            "sub2":{
                "subsub":[{
                    "subsubsub1":1,
                    "subsubsub2":2,
                    "subsubsub3":[1,2,3]
                },
                {
                    "subsubsub1":4,
                    "subsubsub2":5,
                    "subsubsub3":[5,6,4]
                }]
            }
        }]
    }
}

除了一些递归循环之外,我还尝试通过将排序列表转换为排序元组并对它们进行散列来对字典进行排序。

编辑: 该对象被传递到unnest()

    def unnest(d):
    for k, v in d.items():
        if isinstance(v, dict):
            d.update({k: unnest(v)})
        elif isinstance(v, list):
            d.update({k: unsort(v)})
    return d


def unsort(l):
    for i, e in enumerate(l):
        if isinstance(e, dict):
            l[i] = unnest(e)
        elif isinstance(e, list):
            l[i] = unsort(e)
    return sorted(l, key=lambda i: sort_hash(i))


def unnest_hash(d):
    for k, v in d.items():
        if isinstance(v, dict):
            d.update({k: unnest_hash(v)})
        elif isinstance(v, list):
            d.update({k: sort_hash(v)})
    return hash(tuple(sorted(d.items())))


def sort_hash(l):
    if isinstance(l, list):
        for i, e in enumerate(l):
            if isinstance(e, dict):
                l[i] = unnest_hash(e)
            elif isinstance(e, list):
                l[i] = sort_hash(e)
        return hash(tuple(sorted(l)))
    elif isinstance(l, dict):
        return unnest_hash(l)
    else:
        return hash(l)

但是由于某种原因,哈希值被写入“已排序”列表:

{'main': {'key1': 'value1', 'key2': 'value2', 'key3': [{'sub1': 'value2', 'sub2': -4046234112924644199}, {'sub1': 'value1', 'sub2': 4015568797712784641}]}}

如何防止 lambda 函数中的排序值写入返回的排序列表? 谢谢!

最佳答案

您的 sort_hash 函数正在改变传递给它的值。这就是为什么您在原始值中看到它是这样的:

l[i] = unnest_hash(e)

 l[i] = sort_hash(e)

两者都会修改您尝试散列的值。 unnest_hash 也会修改原始值:

d.update({k: unnest_hash(v)})

用于排序的哈希计算绝不能修改其哈希值。

关于Python3 使用 lambda 对嵌套字典的列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52276620/

相关文章:

java - 如何在一个项目中使用不同的语言

python - sqlalchemy.exc.NoReferencedTableError : Foreign key associated with column X could not find table Y with which to generate a foreign key 错误

python-3.x - SAM Lambda : [ERROR] Runtime. ImportModuleError:无法导入模块 'index':没有名为 'pg8000' 的模块

c - C中的通用链表排序函数

python - 如何正确使用 groupby 和先前的过滤器

python - 高效读取文件中的某一行

python-3.x - 如何直接将python模块安装到dist-packages目录中?

python - 请求无法从网页获取文本?

c++ - 排序 float

javascript - Angular Sortable 事件的工作方式与使用 JQuery 不同