Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按值对嵌套字典的列表进行排序_Python_Json_Dictionary_Nested - Fatal编程技术网

Python 按值对嵌套字典的列表进行排序

Python 按值对嵌套字典的列表进行排序,python,json,dictionary,nested,Python,Json,Dictionary,Nested,我有一份字典清单。我需要整理一下。如果这些字典中没有嵌套的字典,那么它就运行得很好。但我需要对嵌套字典进行排序 lis = [{"name": "Nandini", "age": {"name": "Nandini", "age": 20}}, {"name": "Manjeet", "age": 21}

我有一份字典清单。我需要整理一下。如果这些字典中没有嵌套的字典,那么它就运行得很好。但我需要对嵌套字典进行排序

lis = [{"name": "Nandini", "age": {"name": "Nandini", "age": 20}},
       {"name": "Manjeet", "age": 21},
       {"name": "Nikhil", "age": 19}]

# using sorted and lambda to print list sorted
# by age
print("The list printed sorting by age: ")
print(sorted(lis, key=lambda i: i['age']))
因此,我有一个错误:

Traceback (most recent call last):
  File "D:\json\111.py", line 8, in <module>
    print(sorted(lis, key=lambda i: i['age']))
TypeError: '<' not supported between instances of 'int' and 'dict'
回溯(最近一次呼叫最后一次):
文件“D:\json\111.py”,第8行,在
打印(已排序(lis,key=lambda i:i['age']))

TypeError:“您可以使用
运算符与
if/else
组合来指定键:

print(
    sorted(
        lis,
        # Uses age if it is an integer else take the 'second level' age value
        key=lambda i: i['age'] if isinstance(i['age'], int) else i['age']['age']
    )
)
输出:

注:

如果要跳过所有具有嵌套“年龄”的项目,请在排序前将其过滤掉:

print(
    sorted(
        [item for item in lis if isinstance(item['age'], int)],
        key=lambda i: i['age']
    )
)

如果要处理任意数量的嵌套字典,可以使用递归函数对值进行排序:

import sys
from pprint import pp

def getAge(d):
    if isinstance(d, dict):
        return getAge(d.get("age", None))
    elif isinstance(d, int):
        return d
    else:
        # An integer larger than any practical list or string index
        return sys.maxsize

lis = [{"name": "Nandini", "age": {"name": "Nandini", "age": 20}},
       {"name": "Manjeet", "age": 21},
       {"name": "Valodja", "age": "NotANumber"},
       {"name": "Nikhil", "age": 19}]

pp(sorted(lis, key=getAge))
输出:

[{'name': 'Nikhil', 'age': 19},
 {'name': 'Nandini', 'age': {'name': 'Nandini', 'age': 20}},
 {'name': 'Manjeet', 'age': 21},
 {'name': 'Valodja', 'age': 'NotANumber'}]

如果我只想传递嵌套列表的内容,该怎么办?删除else语句时出现无效语法错误。“else pass”用法也有同样的错误。@glu:if/else构造是一个所谓的“三元运算符”,所以它需要一个else语句。您可能希望编辑您的问题,以便更清楚地了解您试图执行的操作:“…传递嵌套列表的内容。”例如,如果我有字典列表,并且字典中有字典,但我不需要内部数据,因此我希望跳过此内部字典。
[{'name': 'Nikhil', 'age': 19},
 {'name': 'Nandini', 'age': {'name': 'Nandini', 'age': 20}},
 {'name': 'Manjeet', 'age': 21},
 {'name': 'Valodja', 'age': 'NotANumber'}]