Python利用operator模块实现对象的多级排序详解
作者:kongxx 发布时间:2023-09-26 20:11:09
标签:python,operator模块,多级排序
前言
最近在工作中碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能。本文介绍了Python用operator模块实现对象的多级排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
比如我有如下的类关系,A对象引用了一个B对象,
class A(object):
def __init__(self, b):
self.b = b
def __str__(self):
return "[%s, %s, %s]" % (self.b.attr1, self.b.attr2, self.b.attr3)
def __repr__(self):
return "[%s, %s, %s]" % (self.b.attr1, self.b.attr2, self.b.attr3)
class B(object):
def __init__(self, attr1, attr2, attr3):
self.attr1 = attr1
self.attr2 = attr2
self.attr3 = attr3
def __str__(self):
return "[%s, %s, %s]" % (self.attr1, self.attr2, self.attr3)
def __repr__(self):
return "[%s, %s, %s]" % (self.attr1, self.attr2, self.attr3)
下面是测试排序代码,这里是按照A对象的内嵌对象B的attr2和attr3属性来排序。
from operator import itemgetter, attrgetter
a1 = A(B('u1', 'AAA', 100))
a2 = A(B('u2', 'BBB', 100))
a3 = A(B('u3', 'BBB', 10))
aaa = (a1, a2, a3,)
print sorted(aaa, key=attrgetter('b.attr2', 'b.attr3'))
print sorted(aaa, key=attrgetter('b.attr2', 'b.attr3'), reverse=True)
运行上面的测试,结果如下:
[[u1, AAA, 100], [u3, BBB, 10], [u2, BBB, 100]]
[[u2, BBB, 100], [u3, BBB, 10], [u1, AAA, 100]]
那么,如果我需要先按b.attr2正序,再按b.attr3倒序来排序,可以使用下面组合来实现:
s = sorted(aaa, key=attrgetter('b.attr3'), reverse=True)
s = sorted(s, key=attrgetter('b.attr2'))
print s
运行结果如下:
[[u1, AAA, 100], [u2, BBB, 100], [u3, BBB, 10]]
来源:http://blog.csdn.net/kongxx/article/details/71122953


猜你喜欢
- JavaScript获取Select当前值写法:var value = document.getElementById("sele
- 本文实例讲述了Python实现的生产者、消费者问题。分享给大家供大家参考,具体如下:生产者、消费者问题,经典的线程同步问题:假设有一个缓冲池
- 前言:用xtarbackup来同步数据,然后基于GTID来设置主从。一、用xtarbackup备份数据库1.1 优势使用xtarbackup
- 介绍在 Go reflect 包里面对 Type 有一个 Comparable 的定义:package reflecttype Type i
- 前言千位分隔符,其实就是数字中的逗号。依西方的习惯,人们在数字中加进一个符号,以免因数字位数太多而难以看出它的值。所以人们在数字中,每隔三位
- 下面这个例子描述的是在Godaddy-Linux托管帐户上使用JSP连接到某个MySQL数据库。 <%@ page
- 其实网上已经有很多这样的类了,不过出于练手的目的还是自己仿照着写了一个。下面的代码放在一个名为UploadFile.class.php文件内
- 如下所示:#-*- encoding:utf-8 -*-import csvimport sys,osimport pymysql def
- 概述这是一个简单的python爬虫程序,仅用作技术学习与交流,主要是通过一个简单的实际案例来对网络爬虫有个基础的认识。什么是网络爬虫简单的讲
- 本文实例为大家分享了vue组件watch属性的具体代码,供大家参考,具体内容如下<!doctype html><html&
- 在pandas里面常用value_counts确认数据出现的频率。1. Series 情况下:pandas 的 value_counts()
- 本文实例讲述了python获取一组数据里最大值max函数用法。分享给大家供大家参考。具体如下:# 最简单的max(1, 2)max('
- 这段时间在处理SQL server 2000 SP4补丁打不上的问题上花了不少时间,回头想想应该总结一下:系统说明:dell1800服务器,
- 1 区分几个路径GOROOT:Golang的安装路径,安装之后就默认自带了GOPATH:Golang的工作目录go_project // (
- 需求描述最近在写一个图像标注小工具,其中需要用到一个缩略图列表,来查看文件夹内的图片文件。这里整理一个基于QListWidget实现的版本,
- 在用Linux(OS:Centos 7.2)时看到有一行代码是:export PYTHONPATH=$PYTHONPATH:/home/us
- mutilprocess像线程一样管理进程,这个是mutilprocess的核心,他与threading很是相像,对多核CPU的
- 由于这两天换了IDE,在导入以前的工程的时候发现了一个大问题,由于以前脑残的我不知道改编码方式,导致出现了大量的GBK,这就很难受,要是一个
- 1、信息表新建立一个字段,并用0、1的方法判断信息的状态。 2、新建一个页面,定时刷新,并查询表中是否有字段值为0的记录。 3、当管理员点击
- 背景实现需求:批量下载联想某型号的全部驱动程序。一般在做网络爬虫的时候,都是保存网页信息为主,或者下载单个文件。当涉及到多文件批量下载的时候