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

时间:2017-05-27 14:12:31

标签: python list python-3.x sorting dictionary

我有一个名为myList的列表。我想要实现的是,我想根据年龄键的值对列表进行排序。我知道它可以用sort函数完成,但我不知道如何为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}}
         ]

2 个答案:

答案 0 :(得分:1)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="inputValue"/>
<input type="button" id="btnId" value="submit"/>

<强> RESULT

  

[{'劳力士':{'年龄':20,'工资':450000}},{'ron':{'年龄':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,'薪水':450000}},{'devon':{'age':33,'salary':600000}},   {'todd':{'age':40,'salary':300000}},{'larrat':{'age':41,   '薪水':350000}}]

答案 1 :(得分:1)

问题是你的列表包含一个包含字典的字典。你需要以某种方式获得内部字典。这通常通过获取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 s更容易:

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