如何对包含许多字典和列表的python列表进行递归排序?
目的:对一本大字典(大约80MB)进行排序 更大的用途:使用排序字典执行dictdiff from dictdiffer模块,以查找所有可能的差异,因为dictdiffer不会对子系列dict、list等进行排序,而只是进行行-行比较,这在现在看来是无用的 下面是一个示例,其中包含子字典、列表和字符串的组合: 大族的一个子族示例:如何对包含许多字典和列表的python列表进行递归排序?,python,dictionary,recursion,Python,Dictionary,Recursion,目的:对一本大字典(大约80MB)进行排序 更大的用途:使用排序字典执行dictdiff from dictdiffer模块,以查找所有可能的差异,因为dictdiffer不会对子系列dict、list等进行排序,而只是进行行-行比较,这在现在看来是无用的 下面是一个示例,其中包含子字典、列表和字符串的组合: 大族的一个子族示例: {"selector": "bus", "acrh": "isr", "category": ["NONES","BACKEND"], "priority": [4,
{"selector": "bus", "acrh": "isr", "category": ["NONES","BACKEND"], "priority": [4,3,1], "nl_date": "6/19/2005", "rl_date": "", "sl_date": "7/3/2040", "stats": {"ports": 2, "music": "", "jack": [54,34,21]}}
How i want it to be:
{"acrh": "isr","category": ["BACKEND","NONES"],"nl_date": "6/19/2005","priority": [1,3,4],"rl_date": "","selector": "bus", "sl_date": "7/3/2040", "stats": {"jack": [21,34,54],"music": "","ports": 2}}
How logic is printing now:
How i want it to be:
{"acrh": "isr","category": ["BACKEND","NONES"],"nl_date": "6/19/2005","priority":[4,3,1],"rl_date": "","selector": "bus", "sl_date": "7/3/2040", "stats": {"ports": 2, "music": "", "jack": [54,34,21]}}
似乎只有键被排序,但子列表和dict的值没有排序
我的代码
prj = {"selector": "bus", "acrh": "isr", "category": ["NONES","BACKEND"], "priority": [4,3,1], "nl_date": "6/19/2005", "rl_date": "", "sl_date": "7/3/2040", "stats": {"ports": 2, "music": "", "jack": [54,34,21]}}
spro = {}
for k,v in sorted(prj.items()):
spro[k] = boss.gosort(self,v)
print(k,"->",spro[k])
def ds(self,d):
trad = {}
for key, value in sorted(d.items()):
if isinstance(value, dict):
trad[key] = boss.ds(self,value)
elif isinstance(value, list):
trad[key] = boss.gosort(self,value)
else:
trad[key] = value
return trad
def gosort(self,inlist):
filist = []
for each in inlist:
print("each is:",each,type(each))
if isinstance(each, dict):
filist.append(boss.ds(self,each))
elif isinstance(each, list):
each.sort()
filist.append(each)
else:
filist.append(each)
return filist ```
Any help would be appriciated.
输出
请忽略带有“我希望它是什么样子”的第5行。类型。在这个排序中_func=lambda v:v如果isinstance(v,list)进行了其他排序(v)我将'str'编辑为'list'以便在列表下进行排序,现在可以使用较小的JSON。我将测试更大的JSON并恢复。
x = {"selector": "bus", "acrh": "isr", "category": ["NONES","BACKEND"], "priority": [4,3,1], "nl_date": "6/19/2005", "rl_date": "", "sl_date": "7/3/2040", "stats": {"ports": 2, "music": "", "jack": [54,34,21]}}
def convert(d):
# sort nested lists
sort_func = lambda v: v if isinstance(v, str) else sorted(v)
y = {k:sort_func(v) for k, v in x.items()}
# using JSON to sort dictionary
return json.dumps(y, sort_keys=True, indent=2)
print(convert(x))
{
"acrh": "isr",
"category": [
"BACKEND",
"NONES"
],
"nl_date": "6/19/2005",
"priority": [
1,
3,
4
],
"rl_date": "",
"selector": "bus",
"sl_date": "7/3/2040",
"stats": [
"jack",
"music",
"ports"
]
}