zoukankan      html  css  js  c++  java
  • Python中的各种排序问题

    本章目录,快速浏览所需内容:


    在编写Python时,经常需要进行排序操作,简单的list排序还是很容易的,碰到复杂的就没办法,只能去查了,现在把编程过程中遇到的所有排序问题列下来,欢迎大家提供更加简洁,高效的排序方法,也欢迎
    大家给出自己在Python遇到的排序问题.

    Python排序根本依赖于两个内建的函数:

    • list.sort() 对list成员进行排序,不返回副本
    • sorted(list) 对list成员进行排序,返回副本

    注:以下使用sorted(list)进行演示

    基本的排序

    1.列表(list)

    1.1按列表元素大小排序

    1. #数值类型 
    2. >>> sorted([1,6,3,2,5,7,4]) 
    3. [1, 2, 3, 4, 5, 6, 7] 
    4.  
    5. #字符类型 
    6. >>> sorted(['a','d','e','b','f','c']) 
    7. ['a', 'b', 'c', 'd', 'e', 'f'] 
    8.  
    9. #字符串类型 
    10. >>> sorted(['a','ad','ada','ad1','abe','b','f','c']) 
    11. ['a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f'] 
    12.  
    13. #字符串中包含大小写 
    14. >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c']) 
    15. ['A', 'Abe', 'a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f'] 
    16.  
    17. #小写字母优先 
    18. >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=str.lower) 
    19. ['a', 'A', 'abe', 'Abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f'] 

    规则解释:

    1. 如果list内的元素是字符/字符串,默认优先将大写字母排前面,其次再按照规则2进行排序;通过参数key=str.lower控制其从小字母优先排.
    2. 如果list内的元素是字符/字符串,将依次按照该字符/字符串的ASCCII值进行排序
    3. 虽然列表内的元素的类型可以不一样,但是sotred(list)不支持列表中既有数字又有字符的排序

    1.2按列表元素的属性

    1. #按列表元素的长度进行排序 
    2. sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=lambda str:len(str)) 
    3. ['a', 'A', 'b', 'f', 'c', 'ad', 'ada', 'ad1', 'abe', 'Abe'] 

    注:
    lambda为匿名函数,没有函数的具体名称,使用匿名函数是为了使代码更为精简.实际上lambda str:len(str)等价于:

    1. def Getlenght(str): 
    2. return len(str) 

    2.字典(dictory)

    1. #对字典进行排序 
    2. >>> sorted({1: 'D', 5: 'B', 2: 'B', 4: 'E', 3: 'A'}) 
    3. [1, 2, 3, 4, 5] 
    4.  
    5. #按照字典中的values的大小进行排序 
    6. >>> dict 
    7. {1: 'DE', 2: 'DDDB', 3: 'A', 4: 'QPOIE', 5: 'WWB'} 
    8. >>> dict.items() 
    9. dict_items([(1, 'DE'), (2, 'DDDB'), (3, 'A'), (4, 'QPOIE'), (5, 'WWB')]) 
    10. >>> sorted(dict.items(),key=lambda value:value[1]) 
    11. [(3, 'A'), (2, 'DDDB'), (1, 'DE'), (4, 'QPOIE'), (5, 'WWB')] 
    12.  
    13. #按照字典中的values的长度进行排序 
    14. >>> sorted(dict.items(),key=lambda value:len(value[1])) 
    15. [(3, 'A'), (1, 'DE'), (5, 'WWB'), (2, 'DDDB'), (4, 'QPOIE')] 

    对字典进行排序,实际上是对字典keys组成的list进行排序,即sorted(dict)==sorted(sorted.values())

    3.元组(tuple)排序

    3.1单个元组排序和列表的方法一样

    1. #元组排序 
    2. >>> tup1=(1,5,3,4,2,7,6) 
    3. >>> sorted(tup1) 
    4. [1, 2, 3, 4, 5, 6, 7] 
    5. >>> tup2=('a','d','f','b','e','c') 
    6. >>> sorted(tup2) 
    7. ['a', 'b', 'c', 'd', 'e', 'f'] 

    3.2元组列表

    1. >>> tuplist=[('a',1),('c',4),('e',0),('d',2),('f',3)] 
    2. >>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),] 
    3. >>>  
    4. #直接对元组列表进行排序 
    5. >>> sorted(tuplist) 
    6. [('a', 1), ('c', 4), ('d', 2), ('e', 0), ('f', 3)] 
    7.  
    8. #按照元组的第某个值进行排序 
    9. >>> sorted(tuplist,key=lambda tup:tup[1]) 
    10. [('e', 0), ('a', 1), ('d', 2), ('f', 3), ('c', 4)] 
    11.  
    12. #按照元组的第某个值进行排序 
    13. >>> sorted(student_tuples, key=lambda student: student[2]) 
    14. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 

    注:直接对元组列表进行排序是按照元组的第一个值进行排序

    高级排序

    1.使用Operator模块

    1. >>> from operator import itemgetter, attrgetter 
    2.  
    3. #一个排序关键字 
    4. >>> sorted(student_tuples, key=itemgetter(2)) 
    5. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 
    6.  
    7. #两个排序关键字 
    8. >>> sorted(student_tuples, key=itemgetter(1,2)) 
    9. [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] 

    2.字符串的多关键字排序

    基于上面的多关键字排序,可以对字符串做一些有趣的排序,平常我们对字符串进行排序时,可能带有数字,这时候排序只是像平常那样逐个字符串ASCCII值进行排序:

    1. >>> list01=['dog1','cat3','bird7','swan4','penguin6','cattle5'] 
    2.  
    3. #字符串排序 
    4. >>> sorted(list01) 
    5. ['bird7', 'cat3', 'cattle5', 'dog1', 'penguin6', 'swan4'] 

    但是有时候我们需要按照字符串中的字母进行排序,这时候就需要将字符串中的数字切割出来,然后传入key参数给sorted.

    1. #按照字符串的某个数字进行排序 
    2. >>> import re 
    3. >>> def sort_str(str): 
    4. if str: 
    5. try: 
    6. c=re.findall('d+',str)[0] 
    7. except: 
    8. c=-1 
    9. return int(c) 
    10.  
    11. >>> sorted(list01,key=sort_str) 
    12. ['dog1', 'cat3', 'swan4', 'cattle5', 'penguin6', 'bird7'] 

    如果字符串中类似这样的,而你只想对字符串的某些位置的数字进行排序,我们先来看看只针对字符串一个特定位置的排序.

    ['cb_cha0_amni0','cb_cha0_amni2','cb_cha1_amni1','cb_cha0_amni3']

    使用上面的排序方法得到

    1. >>> list02=['cb_cha0_amni0','cb_cha0_amni2','cb_cha1_amni1','cb_cha0_amni3'] 
    2. >>> sorted(list02,key=sort_str) 
    3. ['cb_cha0_amni0', 'cb_cha0_amni2', 'cb_cha0_amni3', 'cb_cha1_amni1'] 

    上面的自定义提取数字的函数c=re.findall('d+',str)[0]这一句决定了要对字符串的第几个数字进行排序,假设我要对上面字符数组的第二个值进行排序,重新定义一个提取数值的方法,每次调用返回字符串的第二个数字.

    1. >>> def sort_str1(str): 
    2. if str: 
    3. try: 
    4. c=re.findall('d+',str)[1] 
    5. except: 
    6. c=-1 
    7. return int(c) 
    8.  
    9. >>> sorted(list02,key=sort_str1) 
    10. ['cb_cha0_amni0', 'cb_cha1_amni1', 'cb_cha0_amni2', 'cb_cha0_amni3'] 

    比较炸的是你的需求是:按照字符串中的多个字母排序(比如优先按照第一个字母排序,然后按照第二个字母排序)

    一个想法是:把字符串解析为元组,然后使用itemgetter来完成多关键字排序.

    1. #字符串已经被拆分为元组 
    2. >>> list03=[('cb_cha',0,'_amni',0),('cb_cha',1,'_amni',1),('cb_cha',0,'_amni',2),('cb_cha',0,'_amni',3)] 
    3.  
    4. #对元祖进行多关键字排序 
    5. >>> listtmp=sorted(list03, key=itemgetter(1,3)) 
    6. >>> listtmp 
    7. [('cb_cha', 0, '_amni', 0), ('cb_cha', 0, '_amni', 2), ('cb_cha', 0, '_amni', 3), ('cb_cha', 1, '_amni', 1)] 
    8.  
    9. #将排序后的元组转成字符串 
    10. >>> list(map(lambda strtmp:''.join(map(str,strtmp)),listtmp)) 
    11. ['cb_cha0_amni0', 'cb_cha0_amni2', 'cb_cha0_amni3', 'cb_cha1_amni1'] 
    12.  

    注:这里用了匿名函数和多个map,这对处理大量的数据是的问题,会耗费很多时间.这种情况比较好的方法是使用excle进行排序,当然,你得手动先将数据分割成一列一列的.

    EXCLE的自定义排序
    EXCLE的自定义排序

    学技术之路太难,唯有坚持不懈!!!
  • 相关阅读:
    【学习笔记】Python 3.6模拟输入并爬取百度前10页密切相关链接
    socket编程
    2.4.2电子书fb.c文件
    3.1 电子书框架
    文件浏览器及数码相框 -2.3.2-freetype_arm-2
    文件浏览器及数码相框 -2.3.2-freetype_arm-1
    文件浏览器及数码相框 -2.3.1freetype_pc
    文件浏览器及数码相框 -2.2-字符点阵及汉字库
    文件浏览器及数码相框 -2.1-字符编码
    文件浏览器及数码相框-1
  • 原文地址:https://www.cnblogs.com/wushaogui/p/9096990.html
Copyright © 2011-2022 走看看