gpt4 book ai didi

python - 如何对Python中深度嵌套字典中的所有列表进行排序?

转载 作者:行者123 更新时间:2023-12-01 00:54:55 25 4
gpt4 key购买 nike

我想对深层嵌套字典中的所有列表进行排序。它基本上是一个 JSON 对象,它在列表中深度嵌套字典,然后在字典中列出列表。我想做的就是解析所有叶节点的所有字典键并对我在途中遇到的所有列表进行排序。基本上,任何直接可用的列表或给定字典对象深处的任何列表都应该进行排序,并且应该返回包含所有排序列表的相同字典。

我尝试对 dict 对象进行递归,将遇到的任何 dict 对象传递给递归方法,并在遇到时对列表进行排序。但是,当列表中有一个字典,然后该字典对象中有另一个列表时,它们无法产生结果。

下面的示例 JSON:

my_json = {
a: {
b: {
c: [
{
d: [
{ f: 'some_string' }
]
},
{
e: {
g: [
h: 'another string'
]
}
}
]
}
}
z: [
b: {
c: [
{
d: [
{ f: 'some_string1' }
]
},
{
e: {
g: [
h: 'another string1'
]
}
}
]
},
x: {
c: [
{
d: [
{ f: 'some_string2' }
]
},
{
e: {
g: [
h: 'another string2'
]
}
}
]
}
]
}
def gen_dict_extract(input_dict):
result_obj = input_dict;
if hasattr(var, 'iteritems'):
for k, v in var.iteritems():
if isinstance(v, dict):
for result in gen_dict_extract(v):
yield result
elif isinstance(v, list):
v.sort();
for d in v:
for result in gen_dict_extract(d):
yield result

输出期望只是对所有列表进行排序,无论它们位于何处。我什至可以对字典中的每个项目进行排序,但列表排序是我所需要的。

这里用一个较小的例子来解释输出:

old_json = {
'x': [
{
'z': {
'y': ['agsd', 'xef', 'sdsd', 'erer']
}
},
{
's': {
'f': 'ererer',
'd': [5, 6, 2, 3, 1]
}
}
]
}

new_json = {
'x': [
{
's': {
'f': 'ererer',
'd': [1, 2, 3, 5, 6]
}
},
{
'z': {
'y': ['agsd', 'erer', 'sdsd','xef']
}
}
]
}

Something like above.

最佳答案

如果您希望输出是不同的字典(即不对原始字典进行排序),则函数应如下编写:

def sortedDeep(d):
if isinstance(d,list):
return sorted( sortedDeep(v) for v in d )
if isinstance(d,dict):
return { k: sortedDeep(d[k]) for k in sorted(d)}
return d

这样您就可以像使用内置的sorted()函数一样使用sortedDeep():

new_json = sortedDeep(old_json)

[编辑]改进版本,还将根据嵌入对象的最小键/值对字典列表(或列表列表)进行排序:

def sortedDeep(d):
def makeTuple(v): return (*v,) if isinstance(v,(list,dict)) else (v,)
if isinstance(d,list):
return sorted( map(sortedDeep,d) ,key=makeTuple )
if isinstance(d,dict):
return { k: sortedDeep(d[k]) for k in sorted(d)}
return d

关于python - 如何对Python中深度嵌套字典中的所有列表进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56305009/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com