zoukankan      html  css  js  c++  java
  • 【python cookbook】【数据结构与算法】13.通过公共键对字典列表排序

    问题:想根据一个或多个字典中的值来对列表排序

    解决方案:利用operator模块中的itemgetter()函数对这类结构进行排序是非常简单的。

    # Sort a list of a dicts on a common key
    
    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}
    ]
    
    from operator import itemgetter
    
    rows_by_fname = sorted(rows, key=itemgetter('fname'))
    rows_by_uid = sorted(rows, key=itemgetter('uid'))
    
    from pprint import pprint
    
    print("Sorted by fname:")
    pprint(rows_by_fname)  #pprint模块的pprint()提供了打印出任何python数据结构类和方法。
    
    print("Sorted by uid:")
    pprint(rows_by_uid)
    
    rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))
    print("Sorted by lname,fname:")
    pprint(rows_by_lfname)
    >>> ================================ RESTART ================================
    >>> 
    Sorted by fname:
    [{'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
     {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
     {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
     {'fname': 'John', 'lname': 'Cleese', 'uid': 1001}]
    Sorted by uid:
    [{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
     {'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
     {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},
     {'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
    Sorted by lname,fname:
    [{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},
     {'fname': 'John', 'lname': 'Cleese', 'uid': 1001},
     {'fname': 'Big', 'lname': 'Jones', 'uid': 1004},
     {'fname': 'Brian', 'lname': 'Jones', 'uid': 1003}]
    >>> 

    补充说明:

    有时候会利用lambda表达式来取代itemgetter()的功能:但是利用itemgetter()会运行的更快一些,所以考虑性能的话,应该使用itemgetter()。

    rows_by_fname = sorted(rows, key=lambda r:r['fname'])
    rows_by_uid = sorted(rows, key=lambda r:r['uid'])

    最后,本节展示的技术同样适用于min()和max()这样的函数:

    >>> min(rows, key=itemgetter('uid'))
    {'lname': 'Cleese', 'fname': 'John', 'uid': 1001}
    >>> max(rows, key=itemgetter('uid'))
    {'lname': 'Jones', 'fname': 'Big', 'uid': 1004}
    >>> itemgetter('uid')
    <operator.itemgetter object at 0x023532F0>
    >>>
  • 相关阅读:
    项目一:CRM(客户关系管理系统)--1
    数据库统一API--SQLAlchemy
    消息队列--1--Redis
    消息队列--2--RabbitMQ
    python之路--web--2--Django-11-信号
    python之路--web--2--Django-10--序列化
    python之路--web--2--Django-8-分页
    python之路--web--2--Django-6-Session
    python之路--web--2--Django-5-Cookie
    python之路--web--2--Django-7-跨站请求伪造
  • 原文地址:https://www.cnblogs.com/apple2016/p/5747116.html
Copyright © 2011-2022 走看看