使用排序函数对列表的嵌套列表进行排序。?

2024-09-30 18:19:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张名单叫myList。我想实现的是,我想根据age key的值对列表进行排序。我知道可以用排序函数来完成,但我不知道如何为键编写函数。任何人都可以向我提出解决问题的办法。你知道吗

myList = [ {'john':{'age':30 ,'salary':600000}}, {'mullar':{'age':25 ,'salary':250000}},
           {'todd':{'age':40 ,'salary':300000}},{'rolex':{'age':20 ,'salary':450000}},
           {'ron':{'age':20 ,'salary':500000}},{'gilex':{'age':30 ,'salary':450000}},
           {'larrat':{'age':41 ,'salary':350000}},{'fyoid':{'age':24 ,'salary':400000}},
           {'devon':{'age':33 ,'salary':600000}},{'dron':{'age':20 ,'salary':200000}}
         ]

Tags: key函数列表age排序john解决问题salary
2条回答
def getAge(d):
  salary = list(d.values())[0]['age']
  return salary



#d.values() => dict_values([{'age': 30, 'salary': 600000}])
#list(d.values()) => [{'age': 30, 'salary': 600000}]
#list(d.values())[0] => {'age': 30, 'salary': 600000}
##list(d.values())[0]['age'] => 30
print(sorted(myList,key=getAge))

结果

[{'rolex': {'age': 20, 'salary': 450000}}, {'ron': {'age': 20, 'salary': 500000}}, {'dron': {'age': 20, 'salary': 200000}}, {'fyoid': {'age': 24, 'salary': 400000}}, {'mullar': {'age': 25, 'salary': 250000}}, {'john': {'age': 30, 'salary': 600000}}, {'gilex': {'age': 30, 'salary': 450000}}, {'devon': {'age': 33, 'salary': 600000}}, {'todd': {'age': 40, 'salary': 300000}}, {'larrat': {'age': 41, 'salary': 350000}}]

问题是您的列表中包含一个包含字典的字典。你需要弄到内部字典。这通常通过获取next项来解决:next(iter(subdict.values()))。获取'age'值并不复杂,只需使用'age'索引即可:

>>> sorted(myList, key=lambda x: next(iter(x.values()))['age'])
[{'rolex': {'age': 20, 'salary': 450000}},
 {'ron': {'age': 20, 'salary': 500000}},
 {'dron': {'age': 20, 'salary': 200000}},
 {'fyoid': {'age': 24, 'salary': 400000}},
 {'mullar': {'age': 25, 'salary': 250000}},
 {'john': {'age': 30, 'salary': 600000}},
 {'gilex': {'age': 30, 'salary': 450000}},
 {'devon': {'age': 33, 'salary': 600000}},
 {'todd': {'age': 40, 'salary': 300000}},
 {'larrat': {'age': 41, 'salary': 350000}}]

除了lambda,您还可以def生成函数:

def age(somedict):
    inner_dict, = somedict.values()  # or inner_dict = next(iter(somedict.values()))
    return inner_dict['age']

同样有效:

>>> sorted(myList, key=age)
[... same as above ...]

不过,我个人会首先将字典展平(要么作为单个字典或collections.namedtuple,要么如果您可以访问pandas,然后作为DataFrames):

myList2 = [{'name': key, 'age': value['age'], 'salary': value['salary']}
           for dct in myList
           for key, value in dct.items()]
print(myList2)
#[{'age': 30, 'name': 'john', 'salary': 600000},
# {'age': 25, 'name': 'mullar', 'salary': 250000},
# {'age': 40, 'name': 'todd', 'salary': 300000},
# {'age': 20, 'name': 'rolex', 'salary': 450000},
# {'age': 20, 'name': 'ron', 'salary': 500000},
# {'age': 30, 'name': 'gilex', 'salary': 450000},
# {'age': 41, 'name': 'larrat', 'salary': 350000},
# {'age': 24, 'name': 'fyoid', 'salary': 400000},
# {'age': 33, 'name': 'devon', 'salary': 600000},
# {'age': 20, 'name': 'dron', 'salary': 200000}]

它简化了key-函数:

sorted(myList2, key=lambda x: x['age'])  # or operator.itemgetter('age')
[{'age': 20, 'name': 'rolex', 'salary': 450000},
 {'age': 20, 'name': 'ron', 'salary': 500000},
 {'age': 20, 'name': 'dron', 'salary': 200000},
 {'age': 24, 'name': 'fyoid', 'salary': 400000},
 {'age': 25, 'name': 'mullar', 'salary': 250000},
 {'age': 30, 'name': 'john', 'salary': 600000},
 {'age': 30, 'name': 'gilex', 'salary': 450000},
 {'age': 33, 'name': 'devon', 'salary': 600000},
 {'age': 40, 'name': 'todd', 'salary': 300000},
 {'age': 41, 'name': 'larrat', 'salary': 350000}]

使用DataFrame更容易:

>>> import pandas as pd
>>> df = pd.DataFrame(myList2)
>>> df.sort_values('age')
   age    name  salary
3   20   rolex  450000
4   20     ron  500000
9   20    dron  200000
7   24   fyoid  400000
1   25  mullar  250000
0   30    john  600000
5   30   gilex  450000
8   33   devon  600000
2   40    todd  300000
6   41  larrat  350000

相关问题 更多 >