簡體   English   中英

按值對嵌套字典列表進行排序

[英]Sort list of nested dictionaries by value

我有字典列表。 我需要對其進行排序。 如果這些字典中沒有嵌套字典,那就很好了。 但我需要對嵌套字典進行排序。

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'

但是如果我替換那些嵌套的字典,它會很順利。 有一個答案 how to sort by subkey: sorting list of nested dictionaries in python但我需要一種如何按鍵排序的方法。

您可以將or運算符與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']
    )
)

出去:

The list printed sorting by age: 
[{'name': 'Nikhil', 'age': 19}, {'name': 'Nandini', 'age': {'name': 'Nandini', 'age': 20}}, {'name': 'Manjeet', 'age': 21}]

筆記:

如果您想在排序之前跳過所有具有嵌套“年齡”的項目,請過濾掉它們:

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

如果要處理任意數量的嵌套字典,可以使用遞歸 function 對值進行排序:

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

Output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM