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

简介:

本节书摘来自异步社区《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 = name
          self.id = id
          self.age = age
     def 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 = name
          self.id = id
          self.age = age

     def pretty_print(self):
          print self.name,self.id,self.age

     def 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
相关文章
|
2月前
|
Java 数据处理 索引
(Pandas)Python做数据处理必选框架之一!(二):附带案例分析;刨析DataFrame结构和其属性;学会访问具体元素;判断元素是否存在;元素求和、求标准值、方差、去重、删除、排序...
DataFrame结构 每一列都属于Series类型,不同列之间数据类型可以不一样,但同一列的值类型必须一致。 DataFrame拥有一个总的 idx记录列,该列记录了每一行的索引 在DataFrame中,若列之间的元素个数不匹配,且使用Series填充时,在DataFrame里空值会显示为NaN;当列之间元素个数不匹配,并且不使用Series填充,会报错。在指定了index 属性显示情况下,会按照index的位置进行排序,默认是 [0,1,2,3,...] 从0索引开始正序排序行。
297 0
|
9月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
9月前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
11月前
|
数据挖掘 数据处理 开发者
Python3 自定义排序详解:方法与示例
Python的排序功能强大且灵活,主要通过`sorted()`函数和列表的`sort()`方法实现。两者均支持`key`参数自定义排序规则。本文详细介绍了基础排序、按字符串长度或元组元素排序、降序排序、多条件排序及使用`lambda`表达式和`functools.cmp_to_key`进行复杂排序。通过示例展示了如何对简单数据类型、字典、类对象及复杂数据结构(如列车信息)进行排序。掌握这些技巧可以显著提升数据处理能力,为编程提供更强大的支持。
604 10
|
机器学习/深度学习 数据采集 数据可视化
Python在数据科学中的应用:从入门到实践
本文旨在为读者提供一个Python在数据科学领域应用的全面概览。我们将从Python的基础语法开始,逐步深入到数据处理、分析和可视化的高级技术。文章不仅涵盖了Python中常用的数据科学库,如NumPy、Pandas和Matplotlib,还探讨了机器学习库Scikit-learn的使用。通过实际案例分析,本文将展示如何利用Python进行数据清洗、特征工程、模型训练和结果评估。此外,我们还将探讨Python在大数据处理中的应用,以及如何通过集成学习和深度学习技术来提升数据分析的准确性和效率。
|
数据采集 数据可视化 数据处理
Python数据科学:Pandas库入门与实践
Python数据科学:Pandas库入门与实践
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
机器学习/深度学习 数据可视化 数据处理
Python数据科学:从基础到实战
Python数据科学:从基础到实战
200 1
|
搜索推荐 Python
快速排序的 Python 实践:从原理到优化,打造你的排序利器!
本文介绍了 Python 中的快速排序算法,从基本原理、实现代码到优化方法进行了详细探讨。快速排序采用分治策略,通过选择基准元素将数组分为两部分,递归排序。文章还对比了快速排序与冒泡排序的性能,展示了优化前后快速排序的差异。通过这些分析,帮助读者理解快速排序的优势及优化的重要性,从而在实际应用中选择合适的排序算法和优化策略,提升程序性能。
384 1
|
机器学习/深度学习 数据可视化 数据处理
Python在数据科学中的应用###
本文探讨了Python语言在数据科学领域的广泛应用及其重要性。通过分析Python的简洁语法、强大的库支持和跨平台特性,阐述了为何Python成为数据科学家的首选工具。文章还介绍了Python在数据处理、分析和可视化方面的具体应用实例,展示了其在提升工作效率和推动科学研究方面的巨大潜力。最后,讨论了未来Python在数据科学领域的发展趋势和挑战。 ###

推荐镜像

更多