美文网首页Python,web开发,前端技术分享互联网科技大数据 爬虫Python AI Sql
Python实用技法第12篇:通过公共键对字典列表排序:item

Python实用技法第12篇:通过公共键对字典列表排序:item

作者: IT派森 | 来源:发表于2019-08-06 17:30 被阅读0次

    1、需求🙀

    我们有一个字典列表,想根据一个或多个字典中的值对列表进行排序。

    2、解决方案😸

    利用operator模块中的itemgetter函数对这类结构进行排序是非常简单的。

    • 实例:
    from operator import itemgetter
    rows=[
    {'name':'mark','age':18,'uid':'110'},
    {'name':'miaomiao','age':28,'uid':'150'},
    {'name':'miaomiao','age':8,'uid':'150'},
    {'name':'xiaohei','age':38,'uid':'130'},
    ]
    
    rows_by_name=sorted(rows,key=itemgetter('name'))
    rows_by_uid=sorted(rows,key=itemgetter('uid'))
    print(rows_by_name)
    print(rows_by_uid)
    
    #itemgetter还支持多个键
    rows_by_name_age=sorted(rows,key=itemgetter('name','age'))
    print(rows_by_name_age)
    
    #itemgetter同样适用min、max
    print(min(rows,key=itemgetter('uid')))
    print(max(rows,key=itemgetter('age')))
    
    

    运行结果:

    [{'name': 'mark', 'age': 18, 'uid': '110'}, {'name': 'miaomiao', 'age': 28, 'uid': '150'}, {'name': 'miaomiao', 'age': 8, 'uid': '150'}, {'name': 'xiaohei', 'age': 38, 'uid': '130'}]
    [{'name': 'mark', 'age': 18, 'uid': '110'}, {'name': 'xiaohei', 'age': 38, 'uid': '130'}, {'name': 'miaomiao', 'age': 28, 'uid': '150'}, {'name': 'miaomiao', 'age': 8, 'uid': '150'}]
    [{'name': 'mark', 'age': 18, 'uid': '110'}, {'name': 'miaomiao', 'age': 8, 'uid': '150'}, {'name': 'miaomiao', 'age': 28, 'uid': '150'}, {'name': 'xiaohei', 'age': 38, 'uid': '130'}]
    {'name': 'mark', 'age': 18, 'uid': '110'}
    {'name': 'xiaohei', 'age': 38, 'uid': '130'}
    
    • 讨论

    在这个例子中,rows被传递给内建的sorted()函数,该函数接受一个关键字参数key,这个参数应该代表一个可调用对象(callable),该对象从rows中接受一个单独的元素作为输入并返回一个用来做排序依据的值。itemgetter()函数创建的就是这样的一个可调用对象。

    函数operator.itemgetter()接受的参数可作为查询的标记,用来从rows的记录中提取出所需要的值。它可以是字典的键名称、用数字表示的列表元素或是任何可以传给对象的getitem()方法的值。如果传多个标记给itemgetter(),那么它产生的可调用对象将返回一个包含所有元素在内的元组,然后sorted()将根据对元组的排序结果来排列输出结果。如果想同时针对多个字段做排序,那么这是非常有用的。

    有时候会用lambda表达式取代itemgetter()的功能,例如:

    rows_by_uid=sorted(rows,key=lambda r:r['uid'])
    rows_by_name_age=sorted(rows,key=lambda r:(r['name','age']))
    Python资源分享qun 784758214 ,内有安装包,PDF,学习视频,这里是Python学习者的聚集地,零基础,进阶,都欢迎
    

    这种解决方案通常也能正常工作。但是用itemgetter()通常会运行的更快一些。因此如果需要考虑性能问题的话,应该使用itemgetter().

    相关文章

      网友评论

        本文标题:Python实用技法第12篇:通过公共键对字典列表排序:item

        本文链接:https://www.haomeiwen.com/subject/moyorctx.html