python的排序中,可以使用内置的sort()来对序列进行排序,也可以使用内置的sorted()函数对序列进行排序,区别是,当使用sort()时,是对原序列进行排序,而sorted()则是生成一个新的序列。

1、采用sorted()对序列进行排序,返回一个新的序列

 #使用sorted()函数对序列进行排序
x = [5,2,3,1,4]
y = sorted(x)
print(y) #[1, 2, 3, 4, 5]
print(id(x)) #
print(id(y)) #

2、采用内置的sort()对序列进行排序,返回值为None,对原序列进行排序

 #使用sort()对序列进行排序
a = [5,2,3,1,4]
a.sort()
print(a) #[1, 2, 3, 4, 5]

通常sort()并没有sorted()方便,但是当不需要原序列时,sort()也还可以。

从python2.4开始,list.sort()和sorted()增加了一个key参数,从而对排序规则进行定义

 #定义key值对序列进行排序
lst = sorted('This is a test string from Andrew'.split(),key=str.lower)
print(lst) #['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

注意:key参数的值应该是一个函数,它接受一个参数并返回一个用于排序目的的键。 这种技术速度很快,因为每个输入记录只需要调用一次关键函数。

当需要对一些复杂的对象进行排序时,可以采用复杂对象里面的一些参数作为排序的参数:

 #复杂对象的排序
student_tuple = [
('john','A',15),
('jane','B',12),
('dave','B',10),
]
lst = sorted(student_tuple,key=lambda student:student[2]) #按照年龄排序
print(lst) #[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

同样的技术适用于具有命名属性的对象:

 #复杂对象的排序:
class Student:
def __init__(self,name,grade,age):
self.name = name
self.grade = grade
self.age = age
def __repr__(self):
return repr((self.name,self.grade,self.age))
def weighted_grade(self):
return 'CBA'.index(self.grade)/float(self.age)
student_objects = [
Student('john','A',15),
Student('jane','B',12),
Student('dave','B',10),
]
lst = sorted(student_objects,key=lambda student:student.age)
print(lst) #[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

上面采用的key值的方式对序列进行排序,在python中还提供更快更简单的排序函数,也就是operator模块,其中的itemgetter、attrgetter以及在python2.6中出现的methodcaller

未完待续

yang

python学习-序列排序的更多相关文章

  1. python学习-序列基本知识

    序列是Python中最基本的数据结构.序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推. 用到的主要序列有元组和列表. 先定义一个列表 names=[&q ...

  2. python学习08排序算法举例

    '''''''''排序算法:前提是所有数按照从小到大的顺序排列.1.冒泡算法将第一数与第二个数比较大小,如果第一个数比第二个数大,则沉底(交换位置,使大数在小数后面,这个过程类似于大泡沉底的过程) ' ...

  3. Python学习(三) 八大排序算法的实现(下)

    本文Python实现了插入排序.基数排序.希尔排序.冒泡排序.高速排序.直接选择排序.堆排序.归并排序的后面四种. 上篇:Python学习(三) 八大排序算法的实现(上) 1.高速排序 描写叙述 通过 ...

  4. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

  5. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  6. Python学习小技巧之列表项的排序

    Python学习小技巧之列表项的排序 本文介绍的是关于Python列表项排序的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 典型代码1:     data_list = [6, 9, 1, ...

  7. (私人收藏)python学习(游戏、爬虫、排序、练习题、错误总结)

    python学习(游戏.爬虫.排序.练习题.错误总结) https://pan.baidu.com/s/1dPzSoZdULHElKvb57kuKSgl7bz python100经典练习题python ...

  8. Python学习_数据排序方法

    Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2, ...

  9. python学习6

    1.map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. eg: 2. reduce把一个函数作用在一个序 ...

随机推荐

  1. 公众号菜单中的click

    $params = [ 'button' => [ [ 'type'=>'click', 'name'=>'就送帽子', 'key'=>'V1001_PRESENT', ], ...

  2. 互联网公司面试必问的Redis题目

    Redis是一个非常火的非关系型数据库,火到什么程度呢?只要是一个互联网公司都会使用到.Redis相关的问题可以说是面试必问的,下面我从个人当面试官的经验,总结几个必须要掌握的知识点. 介绍:Redi ...

  3. C++名字查找和重载

    重载函数的定义:在同一作用域内的几个函数名字相同但形参列表不同,称为重载函数.这里有一个重要的前提就是:同一个作用域: 而如果重载函数是定义在不同的作用域,那么一旦编译器在当前作用域找到所需的名字,编 ...

  4. Java之聊天室系统设计一

    任务: 先上实现效果图: 登陆界面: index.jsp: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  5. js的一些编码问题

    1 eval()的使用; 未声明变量的使用: 遗漏的分号; 不恰当的换行; 错误的逗号使用; 语句周围遗漏的括号; switch分支语名中遗漏的break; 重复声明的变量; with的使用; 错误使 ...

  6. python爬虫之下载京东页面图片

    import requests from bs4 import BeautifulSoup import time import re t = 0 #用于给图片命名 for i in range(10 ...

  7. python脚本7_打印九九乘法表

    #打印九九乘法表 for i in range(1,10): s = "" for j in range(1,i+1): s += str(j) + '*' + str(i) + ...

  8. 《深入理解mybatis原理3》 Mybatis数据源与连接池

    <深入理解mybatis原理> Mybatis数据源与连接池 对于ORM框架而言,数据源的组织是一个非常重要的一部分,这直接影响到框架的性能问题.本文将通过对MyBatis框架的数据源结构 ...

  9. Redis原理与实践总结

    Redis原理与实践总结 本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述.如有错误,还望见谅,欢迎指 ...

  10. EASYUI 1.4版 combobox firefox 下不支持中文检索的问题

    easyui 的combobox 在IE下面输入中文,可以自动实现筛选和检索的功能,但是在firefox下面不可以. 于是查了一些资料,发现原来是浏览器对于中文输入法的处理问题,对于chrome 和 ...