本节书摘来自异步社区《Python数据科学指南》一书中的第1章,第1.23节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.23 采用键排序

到目前为止,我们的示例都是采用元素对列表或其他序列进行排序,现在我们来试试对它们采用键排序。在前面的那些示例中,元素即是键。而在真实场景中,记录的复杂度要高得多,一条记录包含了多个列,我们有时需要对其中一个或多个列进行排序。我们通过对一个元组的列表进行排序来阐述,并将之推广到其他的序列类型。

1.23.1 准备工作

本示例中,一个单独的元组表示一个人的个人记录,包括名字、ID、年龄等。我们来编写一段对不同的域进行排序的代码。

1.23.2 操作方法

我们使用列表和元组来编写一个记录类的结构,并使用这些数据演示如何采用键进行排序。

# 1.首先创建一个元组组成的列表用来测试排序
employee_records = [ ('joe',1,53),('beck',2,26), \('ele',6,32),('neo',3,45), \('christ',5,33),('trinity',4,29), \]# 2.使用雇员名字进行排序
print sorted(employee_records,key=lambda emp : emp[0])
"""
输出结果如下。
[('beck', 2, 26), ('christ', 5, 33), ('ele', 6, 32), ('joe', 1, 53),\
('neo', 3, 45), ('trinity', 4, 29)]
"""
# 3. 使用雇员ID进行排序
print sorted(employee_records,key=lambda emp : emp[1])
"""
输出结果如下。
[('joe', 1, 53), ('beck', 2, 26), ('neo', 3, 45), ('trinity', 4, 29),\
('christ', 5, 33), ('ele', 6, 32)]
"""
# 4. 使用雇员年龄进行排序
print sorted(employee_records,key=lambda emp : emp[2])
"""

输出结果如下。

[('beck', 2, 26), ('trinity', 4, 29), ('ele', 6, 32), ('christ', 5,\
33), ('neo', 3, 45), ('joe', 1, 53)]
"""

1.23.3 工作原理

在我们的示例中,每条记录有3个域:姓名、ID和年龄。我们使用lambda函数来将我们需要排序的键进行传递。在第2步中,我们将姓名作为键来进行排序。类似地,在第2步和第3步中,都分别采用了ID和年龄作为键,这些不同步骤里的不同输出结果显示了我们想要的排序结果。

1.23.4 更多内容

由于键排序十分重要,Python提供了快捷的函数来访问键,而不用自己写lambda函数。operator模块中提供了itemgetter、attrgetter和methodcaller等几个函数。前面排序示例我们可以使用itemgetter来重写,代码如下。

from operator import itemgetter
employee_records = [ ('joe',1,53),('beck',2,26), \('ele',6,32),('neo',3,45), \('christ',5,33),('trinity',4,29), \]
print sorted(employee_records,key=itemgetter(0))
"""
[('beck', 2, 26), ('christ', 5, 33), ('ele', 6, 32), ('joe', 1, 53),\
('neo', 3, 45), ('trinity', 4, 29)]
"""
print sorted(employee_records,key=itemgetter(1))
"""
[('joe', 1, 53), ('beck', 2, 26), ('neo', 3, 45), ('trinity', 4, 29),\
('christ', 5, 33), ('ele', 6, 32)]
"""
print sorted(employee_records,key=itemgetter(2))
"""
[('beck', 2, 26), ('trinity', 4, 29), ('ele', 6, 32), ('christ', 5,\
33), ('neo', 3, 45), ('joe', 1, 53)]
"""

请注意我们不再使用lambda函数,而是采用itemgetter来指定我们用来排序的键。如果需要多级排序,itemgetter可以接收多个用来排序的域。例如,我们先对名字,再对年龄进行排序,那代码如下。

>>> sorted(employee_records,key=itemgetter(0,1))
[('beck', 2, 26), ('christ', 5, 33), ('ele', 6, 32), ('joe', 1, 53),
('neo', 3, 45), ('trinity', 4, 29)]

如果可迭代对象里的元素是类对象,则可以用attrgetter和methodcaller轻松搞定。请看如下示例。

# 将雇员记录封装为类对象
class employee(object):def __init__(self,name,id,age):self.name = nameself.id = idself.age = agedef pretty_print(self):print self.name,self.id,self.age# 将这些类对象填入列表里
employee_records = []
emp1 = employee('joe',1,53)
emp2 = employee('beck',2,26)
emp3 = employee('ele',6,32)employee_records.append(emp1)
employee_records.append(emp2)
employee_records.append(emp3)# 打印输出记录
for emp in employee_records:emp.pretty_print()from operator import attrgetter
employee_records_sorted = sorted(employee_
records,key=attrgetter('age'))
# 打印输出排序后的记录
for emp in employee_records_sorted:emp.pretty_print()

构造器使用name、age和ID等3个变量对类进行初始化,类还拥有一个pretty_print方法来输出类对象的各个值。

接着,把这些类对象填入一个列表。

employee_records = []
emp1 = employee('joe',1,53)
emp2 = employee('beck',2,26)
emp3 = employee('ele',6,32)
employee_records.append(emp1)
employee_records.append(emp2)
employee_records.append(emp3)

现在,我们有一个雇员对象的列表,每个对象中有3个变量:name、ID和age。我们将列表打印输出来观察其顺序。

joe 1 53
beck 2 26
ele 6 32

如你所见,你的输入顺序被保留下来了。现在,我们使用attrgetter根据age域来对列表进行排序。

employee_records_sorted = sorted(employee_
records,key=attrgetter('age'))

打印输出排序后的列表,结果如下。

beck 2 26
ele 6 32
joe 1 53

记录已经被按照年龄进行了排序。

如果想用类里的某个方法来决定排序方式,我们得使用methodcaller。我们设计一个演示场景:添加一个随机方法,将年龄除以ID。

class employee(object):def __init__(self,name,id,age):self.name = nameself.id = idself.age = agedef pretty_print(self):print self.name,self.id,self.agedef random_method(self):return self.age / self.id# 填充数据
employee_records = []
emp1 = employee('joe',1,53)
emp2 = employee('beck',2,26)
emp3 = employee('ele',6,32)employee_records.append(emp1)
employee_records.append(emp2)
employee_records.append(emp3)from operator import methodcaller
employee_records_sorted = sorted(employee_records,key=methodcaller('ra\
ndom_method'))
for emp in employee_records_sorted:emp.pretty_print()

现在我们调用这个方法来进行排序。

sorted(employee_records,key=methodcaller('random_method'))

打印输出排序后的列表,结果如下。

ele 6 32
beck 2 26
joe 1 53

《Python数据科学指南》——1.23 采用键排序相关推荐

  1. 《Python数据科学指南》——1.8 使用迭代器

    本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.8节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异步 ...

  2. 《Python数据科学指南》——1.17 使用映射函数

    本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.17节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...

  3. 《Python数据科学指南》——1.16 使用lambda创造匿名函数

    本节书摘来自异步社区<Python数据科学指南>一书中的第1章,第1.16节,作者[印度] Gopi Subramanian ,方延风 刘丹 译,更多章节内容可以访问云栖社区"异 ...

  4. python数据科学指南是什么_《Python数据科学指南》——导读

    前 言 如今,我们生活在一个万物互联的世界,每天都在产生海量数据,不可能依靠人力去分析产生的所有数据并做出决策.人类的决策越来越多地被计算机辅助决策所取代,这也得益于数据科学的发展.数据科学已经深入到 ...

  5. python数据科学指南是什么_Python数据科学实践 | Spyder入门

    Spyder入门 01 Spyder--Python编程的"热带雨林" Spyder是一个用于科学计算的使用Python编程语言的集成开发环境(IDE).它结合了综合开发工具的高级 ...

  6. python数据科学-单变量数据分析

    总第85篇 01|背景: 我们在做机器学习之前,需要自己先对数据进行深入的了解(这些数据是什么类型,总共有多少数据,有没有缺失值,均值是多少之类的),只有自己对数据足够了解了,才能够更好地利用机器学习 ...

  7. 《Python数据科学实践指南》——0.2节如何成为数据科学家

    本节书摘来自华章社区<Python数据科学实践指南>一书中的第0章,第0.2节如何成为数据科学家,作者纪路,更多章节内容可以访问云栖社区"华章社区"公众号查看 0.2 ...

  8. python书籍推荐:Python数据科学手册

    所属网站分类: 资源下载 > python电子书 作者:today 链接:http://www.pythonheidong.com/blog/article/448/ 来源:python黑洞网 ...

  9. visio 科学图形包_【数据科学的python系列3】Python数据科学环境设置

    1. 用Python搭建数据科学环境 今天,在本篇Python数据科学教程中,我们将看到Python的数据科学环境设置.此外,我们将告诉你数据科学环境设置需要安装的所有内容,如Python.Anaco ...

最新文章

  1. 哭了,现在看来高校4月中旬能开学算是早的了,非毕业生可能会更晚
  2. 云计算大会有感—MapReduce和UDF
  3. 实现在tabcontrol里面拖拽tabpage来设置tabpage的位置
  4. 软考考试仅剩几天,如何冲刺?
  5. 创建python虚拟环境,安装django,创建一个django项目,在项目中创建一个应用(ubuntu16.04)...
  6. OpenSSL(openssl-1.0.1h)编译与安装(Win7)
  7. [html] html标签中的lang属性有什么作用?
  8. mysql field flags_PHPmysql_field_flags()实例教程_PHP教程
  9. Git笔记(30) 重写历史
  10. signature=0fa666ae90cad1ed3ef6de6b7db4e5a3,A meta-analysis on correlations of
  11. Buy Tickets POJ - 2828 思维+线段树
  12. 通达+oa+php+文件+乱,通达OA文件上传+文件包含get shell复现
  13. 大家崇拜凯文.米特尼克吗?
  14. 区块链中国专利分析报告.20180309
  15. Vasya the Hipster - CodeForces - 581A
  16. 刘备是怎样“融资”创业的?
  17. HHKB键盘使用说明书
  18. uniapp:索引列表
  19. Ubuntu用户管理原理
  20. 中国头孢菌素药物行业市场供需与战略研究报告

热门文章

  1. Chrome 浏览器调试移动端
  2. VMware虚拟机上安装Linux系统
  3. 9 Redis 持久化AOF
  4. 8-1日复习 模板函数 模板类
  5. mysql日期存到oracle_mysql与oracle的日期/时间函数小结
  6. 重磅 !间隔分析正式上线,神策数据分析能力再度增强
  7. [ZOJ 4014] Pretty Matrix
  8. Java虚拟机运行流程
  9. JavaScript强化教程——AJAX
  10. emacs org-mode文件转html文件