问题

你想排序类型相同的对象,但是他们不支持原生的比较操作。

解决方案

内置的 sorted() 函数有一个关键字参数 key ,可以传入一个 callable 对象给它, 这个 callable 对象对每个传入的对象返回一个值,这个值会被 sorted 用来排序这些对象。 比如,如果你在应用程序里面有一个 User 实例序列,并且你希望通过他们的 user_id 属性进行排序, 你可以提供一个以 User 实例作为输入并输出对应 user_id 值的 callable 对象。比如:

class User:    def __init__(self, user_id):        self.user_id = user_id    def __repr__(self):        return 'User({})'.format(self.user_id)def sort_notcompare():    users = [User(23), User(3), User(99)]    print(users)    print(sorted(users, key=lambda u: u.user_id))

另外一种方式是使用 operator.attrgetter() 来代替 lambda 函数:

>>> from operator import attrgetter>>> sorted(users, key=attrgetter('user_id'))[User(3), User(23), User(99)]>>>

讨论

选择使用 lambda 函数或者是 attrgetter() 可能取决于个人喜好。 但是, attrgetter() 函数通常会运行的快点,并且还能同时允许多个字段进行比较。 这个跟 operator.itemgetter() 函数作用于字典类型很类似(参考上篇帖子)。 例如,如果 User 实例还有一个 first_name 和 last_name 属性,那么可以像下面这样排序:

`by_name = sorted(users, key=attrgetter('last_name', 'first_name'))`

同样需要注意的是,这一小节用到的技术同样适用于像 min() 和 max() 之类的函数。比如:

>>> min(users, key=attrgetter('user_id'))User(3)>>> max(users, key=attrgetter('user_id'))User(99)>>>
>>> min(users, key=attrgetter('user_id'))User(3)>>> max(users, key=attrgetter('user_id'))User(99)>>>

delphi webbrowser 对象不支持_【Python 秘籍】排序不支持原生比较的对象相关推荐

  1. snmpset对象不可写_[Python]可变对象与多进程通信

    一.可变对象与不可变对象 参考Python 的函数是怎么传递参数的? 具体看文档就行了,这里引用文章的结论: 1.对于不可变对象作为函数参数,相当于C系语言的值传递: 2.对于可变对象作为函数参数,相 ...

  2. python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期 | 学步园...

    最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...

  3. python对象的生命周期_(python)通过一个代码例子来分析对象的生命周期

    最近在学习python,看的是<简明python教程>,写的很是通俗易懂. 在一个类和对象的变量的例子中,看到代码运行结果突然想到在python中对象的生命周期的问题,代码运行结果: #! ...

  4. java 对象排重_现代化的 Java (八)——重说对象序列化

    事故 昨晚上准备把 sequences 服务扔到我的旧笔记本上然后写下单系统,然后发现一个很囧的事情-- 消息序列化竟然失败了. 翻过去的代码,逐个排除问题,基本上结论是:因为过去我的测试写的太简单, ...

  5. mysql未将对象引用设置到对象的实例_记一次未将对象引用设置到对象的实例问题的排查过程...

    最近在给一个老项目做数据对接接口. 背景一 该项目最后更新日期为2006年,使用ASP.NET WebForm..Net2.0.OJB.Castle Avtive Record等.由于是某集团的子系统 ...

  6. calc ie支持_让IE6/IE7/IE8支持CSS3属性的8种方法介绍

    让IE6/IE7/IE8支持CSS3属性的8种方法介绍 发布时间:2013-09-23 10:43:06   作者:佚名   我要评论 IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现 ...

  7. word2013插入excel对象报错_修改Word文档中嵌入的Excel对象

    I need example code or even a 3rd party object that will allow me to get to an excel object embedded ...

  8. unc 目录不受支持_[Bat]UNC路径不支持的2种解决方法

    UNC(Universal Naming Convention),\\servername\sharename,其中servername是服务器名.sharename是共享资源的名称 1.使用push ...

  9. html 对象元素如何获取div 里的data值 原生和jq对象两种获取

    这是对象,需要获取到div里的data-id的值 转成jq对象就行了 console.log($(t).data("id")) 2.打印一下当前元素: 获取当前事件元素: t.cu ...

  10. 小甲鱼python笔记_[Python]之前初学python,看小甲鱼视频的笔记(未整理)

    BIF == Built-in functions (内置函数) 用冒号: 而不是分号: 001作业 0.Python是一种面向对象的脚本语言. 1.IDLE是python的一个shell. 2.输出 ...

最新文章

  1. 白话JAVA守护线程
  2. FORK()子进程对父进程打开的文件描述符的处理
  3. 如何利用计算机网络辅助自己,如何借助计算机网络辅助大学英语写作教学.doc...
  4. 深入理解javascript原型和闭包(4)——隐式原型
  5. ASP.NET MVC3 中设置htmlAttribute
  6. 2.3.3单链表的双向链表
  7. CSS: 深入理解BFC和Margin Collapse (margin叠加或者合并外边距)
  8. 编程语言中,差、交、并、自然连接、选择、投影、笛卡尔积分别都是什么运算...
  9. 自动挡跑高速用S挡还是D挡? 回答
  10. L2-007. 家庭房产-PAT团体程序设计天梯赛GPLT
  11. 小数分频器vhdl实现_verilog 实现小数分频(小数分频器)代码
  12. 微信检测器 微信过滤工具
  13. Android 后台保活,这里有你需要的所有姿势。2019,最新版本。
  14. python如何将两个list合并成字典_怎么把两个列表合并成字典 论Python怎样将两个list合并为一个字典...
  15. LeedCode 241. Different Ways to Add Parentheses
  16. Typora更新版本后要收费
  17. 领域模型和领域对象的概念
  18. STM32开发项目:STM32F407的BootLoader程序
  19. 微信小程序-底部导航栏
  20. VC中一个关于宏的使用问题 A2W W2A

热门文章

  1. 计算机科学与技术真的会掉头发吗,大学“最辛苦”的三个专业,“脱发率”很高,毕业后却都很吃香!...
  2. jittor和pytorch生成网络对比之acgan
  3. [ 一起学React系列 -- 11 ] React-Router4 (1)
  4. TCP/IP记一次关于IP地址和MAC物理地址的思考
  5. poj3264 - Balanced Lineup(RMQ_ST)
  6. 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)
  7. su 和su -的区别
  8. user-select介绍
  9. AS3.0(3)-函数;类;对象
  10. 【Vegas原创】SQL case when 用法