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>
    >>>
  • 相关阅读:
    Spark SQL学习笔记
    《空空》陈粒
    支持向量机
    p.Value越显著,X变量越重要嘛?
    回归的武林绝学
    Neural Collaborative Filtering论文笔记
    make 学习笔记
    『并发包入坑指北』之阻塞队列
    线程池中你不容错过的一些细节
    利用策略模式优化过多 if else 代码
  • 原文地址:https://www.cnblogs.com/apple2016/p/5747116.html
Copyright © 2011-2022 走看看