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

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

一、 解决问题

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

二、解决方案

模块: 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值