python:列表排序方法

基础排序:

使用Python内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列

sorted()方法:

简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list,新的list的元素基于小于运算符(__lt__)来排序。


sorted()语法:

sorted(iterable, key=None, reverse=False)  #注在python2中该函数还有个cmp参数,不过在3中取消了


参数:

iterable -- 可迭代对象。
cmp(了解):用于比较的函数,比较什么由key决定;
key -- 主要是用来进行比较的元素,只有一个参数。用列表元素的某个属性或函数作为关键字,有默认值,迭代集合中的一项(指定可迭代对象中的一个元素来进行排序。)
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回值:

返回重新排序的列表。

参数说明:
(1)  cmp参数(了解):cmp接受一个函数,拿整形举例,形式为:

def f(a,b):
     return a-b

如果排序的元素是其他类型的,如果a逻辑小于b,函数返回负数(-1);a逻辑等于b,函数返回0;a逻辑大于b,函数返回正数(1)就行了
 
(2)  key参数:key也是接受一个函数,不同的是,这个函数只接受一个元素,形式如下

def f(a):
     return len(a)

key接受的函数返回值,表示此元素的权值,sorted将按照权值大小进行排序
 
(3) reverse参数:接受False 或者True 表示是否逆序


简单排序:

例1:

list = [5, 2, 3, 1, 4]

new_list = sorted(list)

print(new_list,list)


#[1, 2, 3, 4, 5] [5, 2, 3, 1, 4]

例1_1:

list = [5, 2, 3, 1, 4]

new_list = sorted(list,reverse = True)

print(new_list,list)

#[5, 4, 3, 2, 1] [5, 2, 3, 1, 4]

关键字排序:

例2:

list = [('b',2),('a',1),('c',3),('d',4)]

new_list = sorted(list, key=lambda x:x[1],reverse=True) #序列为第一个参数的序列(x[1]表示按任意元素中索引为1的元素排序)

print(new_list)

#[('d', 4), ('c', 3), ('b', 2), ('a', 1)]

例3:

List = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]

def f(x):          
    return len(x)

new_list = sorted(List,key = f)    #按照元素长度排序

print(new_list)


#[{1: 9}, {1: 5, 3: 4}, {1: 3, 6: 3}, {1: 1, 2: 4, 5: 6}]

例4:

List = ['Chr1-10.txt','Chr1-1.txt','Chr1-2.txt',
            'Chr1-14.txt',
            'Chr1-3.txt','Chr1-20.txt','Chr1-5.txt']

def func(element):
    return int(element.split('-')[1].split('.')[0])
#对元素进行连续两次切片操作(比较函数的参数表示列表中的任意元素)

new_list = sorted(List, key=func)
#new_list = sorted(List, key=lambda d : int(d.split('-')[-1].split('.')[0]))

print(new_list)


#['Chr1-1.txt', 'Chr1-2.txt', 'Chr1-3.txt', 'Chr1-5.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-20.txt']

注:
这就是key的功能,制定排序的关键字,通常都是一个lambda函数,当然你也可以事先定义好这个函数。如果不将这个关键字转化为整型,结果是这样的:

sorted(s, key=lambda d : d.split('-')[-1].split('.')[0])

['Chr1-1.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-2.txt', 'Chr1-20.txt', 'Chr1-3.txt', 'Chr1-5.txt']

这相当于把这个关键字当做字符串了,很显然,在python中,'2' > '10'

你可以定制你想要的key, 如 key = lambda x : len(x) 按照序列的长度去排序。key= lambda x : (x[1], x[0]) 按二个元素,再第一个 等等。。。

例5:

from operator import itemgetter, attrgetter

students = [('john', 'A', 15),
            ('jane', 'B', 12),
            ('dave', 'B', 10),]

new_student = sorted(students, key=lambda student : student[2])   # sort by age(索引为2的元素排序)

new_student_1 = sorted(students, key=itemgetter(2))#根据第二个域进行排序

new_student_2 = sorted(students, key=itemgetter(1,2))  # sorted by grade then by age(有相同值时,根据多个元素排序)

print(new_student)
print(new_student_1)
print(new_student_2)

"""
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]
"""

对由字典排序 

例6:

from operator import itemgetter, attrgetter

d = {'data1':3, 'data2':1, 'data3':2, 'data4':4}

new_d = sorted(d.items(), key=itemgetter(1), reverse=True)
#d.items():使用items()先将字典转换为二元组的列表

print(new_d)

#[('data4', 4), ('data1', 3), ('data3', 2), ('data2', 1)]

注:返回的是由tuple组成的List,不再是字典。

对字符串进行排序

例7:

str = "This is a test string from Andrew"

split_str = str.split(" ")
print("原序列:",split_str)

new_str = sorted(split_str,key=lambda x:x[0])

new_str_1 = sorted(split_str,key=lambda x: x.lower())


print("区分大小写的排序:",new_str)
print("不区分大小写的排序:",new_str_1)

"""
原序列: ['This', 'is', 'a', 'test', 'string', 'from', 'Andrew']
区分大小写的排序: ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
不区分大小写的排序: ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
"""

sort()函数

描述
sort()函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。语法

sort()方法语法:

list.sort(cmp=None, key=None, reverse=False)

参数
cmp(了解) -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。

返回值
该方法没有返回值,但是会对列表的对象进行排序。

例8:

aList = ['Google', 'Runoob', 'Taobao', 'Facebook']

aList.sort()
print("List : ", aList)

#List :  ['Facebook', 'Google', 'Runoob', 'Taobao']

例9:

# 获取列表的第二个元素
def takeSecond(elem):
    return elem[1]

# 列表
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
random_1 = [(2, 2), (3, 4), (4, 1), (1, 3)]

# 指定第二个元素排序
random.sort( key= takeSecond)
random_1.sort(key=lambda x:x[0])

# 输出类别
print('排序列表:', random)
print('排序列表:', random_1)

"""
排序列表: [(4, 1), (2, 2), (1, 3), (3, 4)]
排序列表: [(1, 3), (2, 2), (3, 4), (4, 1)]
"""

注:
sort 与 sorted 区别:

1、sort ()是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

2、list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
 

备注:

在python2.4前,sorted()和list.sort()函数没有提供key参数,但是提供了cmp参数来让用户指定比较函数。此方法在其他语言中也普遍存在。

在python3.0中,cmp参数被彻底的移除了,从而简化和统一语言,减少了高级比较和__cmp__方法的冲突。

在python2.x中cmp参数指定的函数用来进行元素间的比较。此函数需要2个参数,然后返回负数表示小于,0表示等于,正数表示大于。例如:

>>> def numeric_compare(x, y):
        return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare)
[1, 2, 3, 4, 5]

当我们将现有的2.x的代码移植到3.x时,需要将cmp函数转化为key函数:使用functools模块中的cmp_to_key()函数例10:
 

from functools import cmp_to_key

list = [{1:5,3:4},{1:3,6:3},{1:1,2:4,5:6},{1:9}]

def f2(a,b):
    return a[1]-b[1]

new_list = sorted(list,key = cmp_to_key(f2))
#按照每个字典元素里面key为1的元素的值排序

print(new_list)

#[{1: 1, 2: 4, 5: 6}, {1: 3, 6: 3}, {1: 5, 3: 4}, {1: 9}]

猜你喜欢

转载自blog.csdn.net/qq_39314932/article/details/85041194