通过某个关键字,排序一个字典列表

一、 解决问题

根据某个或某几个字典字段来排序字典列表。

二、解决方案

模块: operator
函数: itemgetter

三、代码说明

#!/usr/bin/env/python
#cofing=utf-8

"""
operator.itemgetter(item)
operator.itemgetter(*items)
    这个函数会调用所传入的操作数的__getitem__()方法返回一个带有item的可调用对象

operator.attrgetter(attr)
operator.attrgetter(*attrs)
    返回一个带有操作数中的attr属性的可调用对象


"""
from operator import itemgetter, attrgetter

#待排序数据
rows = [
    {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
    {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
    {'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
    {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]

rows_by_name = sorted(rows, key=itemgetter('fname'))
print (rows_by_name)
"""
[{'uid': 1004, 'fname': 'Big', 'lname': 'Jones'}, 
{'uid': 1003, 'fname': 'Brian', 'lname': 'Jones'}, 
{'uid': 1002, 'fname': 'David', 'lname': 'Beazley'}, 
{'uid': 1001, 'fname': 'John', 'lname': 'Cleese'}]
"""

rows_by_uid = sorted(rows, key=itemgetter('uid'))
print (rows_by_uid)
"""
[{'lname': 'Cleese', 'fname': 'John', 'uid': 1001}, 
{'lname': 'Beazley', 'fname': 'David', 'uid': 1002}, 
{'lname': 'Jones', 'fname': 'Brian', 'uid': 1003}, 
{'lname': 'Jones', 'fname': 'Big', 'uid': 1004}]
"""

# 支持多个
rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
print(rows_by_lfname)
"""
[{'uid': 1002, 'lname': 'Beazley', 'fname': 'David'}, 
{'uid': 1001, 'lname': 'Cleese', 'fname': 'John'}, 
{'uid': 1004, 'lname': 'Jones', 'fname': 'Big'}, 
{'uid': 1003, 'lname': 'Jones', 'fname': 'Brian'}]
"""

使用lambda函数进行替代

# 使用lambda 表达式替代
rows_by_fname = sorted(rows, key=lambda r: r['fname'])
rows_by_lfname = sorted(rows, key= lambda r: (r['lname'], r['fname']))

四、关联知识

参照blog: python中sort和sorted函数

五、总结

  1. 当标准库需要使用key做参数时,可以考虑参入operator.itemgetter(),operator.attrgetter()方法来进行传入一个可调用对象。

    • min(),max() ->key参数,就是比较时的规则。

六、代码地址

github地址:https://github.com/weichen666/python_cookbook
目录/文件:first_selection/learn_operation_itemgetter

七、参考

python中sort和sorted函数:http://blog.csdn.net/qq_29883591/article/details/51615499

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐