Python列表的排序指南

Python中常用的排序方法

sorted()

sorted()函数是Python中的内置函数,它可以从一个可迭代对象构建出一个新的列表。

a = [4, 28, 3, 22, 9, 6]
b = sorted(a)
print("a:", a)  # 原列表
print("b:", b)  # 排序后的列表

结果如下

a: [4, 28, 3, 22, 9, 6]
b: [3, 4, 6, 9, 22, 28]

可以看出,用sorted()函数排序后原列表元素顺序不变,而新的列表则按升序排序。
如果只是做简单的列表升序排序,可以直接使用sorted()方法来实现。

list.sort()

list.sort()是Python列表的一个内置方法,它跟sorted()方法不同的是,它会直接修改原列表。

a = [6, 3, 9, 7, 11, 2]
a.sort()
print(a)

结果如下

[2, 3, 6, 7, 9, 11]

原列表中元素的顺序发生了改变。

reversed()

reversed()函数返回一个反转的迭代器

a = [6, 3, 9, 7, 11, 2]
b = reversed(a)  # 反转的迭代器
c = list(reversed(a))  # 迭代器转换成列表
print("a:", a)
print("b:", b)
print("c:", c)

结果如下

a: [6, 3, 9, 7, 11, 2]
b: <list_reverseiterator object at 0x0000029EF7535C48>
c: [2, 11, 7, 9, 3, 6]

reversed()函数用在列表中会返回一个迭代器对象,可以使用list()方法将迭代器转换为列表

list.reverse()

list.reverse()也是Python列表的一个方法,用于反向列表的元素,和reversed()函数差不多

a = [6, 3, 9, 7, 11, 2]
a.reverse()
print(a)

结果如下

[2, 11, 7, 9, 3, 6]

类型list.sort(),它也会直接改变原列表的元素顺序

random.shuffle()

在random库中有一个shuffle()方法可以将列表的所有元素进行随机排序

a = [1, 2, 3, 4, 5, 6]
random.shuffle(a)
print(a)

结果如下

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

原列表的元素顺序被随机打乱

深入探讨sorted()函数

上面介绍了Python中常用的排序方法,其中sorted()方法还有很多比较实用的地方。

重要参数说明
sorted(iterable, key=None, reverse=False)

其中:

  1. iterable -- 可迭代对象
  2. key -- 关键函数
  3. reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
对可迭代对象进行排序

list.sort()方法只是为列表定义的,而sorted()方法可以接受任何可迭代对象。
我们尝试对一个字典进行sorted()排序

a = {4: 'four', 3: 'three', 9: 'nine', 6: 'six'}
b = sorted(a)
print(b)

结果如下

[3, 4, 6, 9]

得到的结果是一个列表(其实就是dict.keys()列表,字典中的键列表)

实际上,sorted()函数是不能对字典进行排序的,因为在Python中字典是无序的。
如果实在想得到一个有序字典,你可以使用collections模块中OrderedDict()来生成一个有序字典。

关键函数

sorted()中的形参key是用于指定排序前对列表中的每个元素进行调用的函数。

a = 'Whatever Is worth Doing is Worth doing well'
b = sorted(a.split(), key=str.lower)
print(b)

结果如下

['Doing', 'doing', 'is', 'Is', 'well', 'Whatever', 'worth', 'Worth']

上面的key=str.lower是先对列表中的每一个变成小写字母的单词进行比较,再对原列表进行升序排序。

key形参的值是一个函数,它接收一个参数并返回一个用于排序的键

def last(t):
    """t参数是一个元组,返回元组中的最后一个元素"""
    return t[-1]

a = [
    ('Tony', 'A', 90),
    ('Lisa', 'C', 88),
    ('Jack', 'B', 95),
]
b = sorted(a, key=last)
print(b)

结果如下

[('Lisa', 'C', 88), ('Tony', 'A', 90), ('Jack', 'B', 95)]

以上例子的key值是一个last函数,用于获取元组中最后一个元素,而a列表中的元素是格式相同的元组,
因此通过last函数可以获取列表中的每一个元组最后一个元素,也就是90, 88, 95这三个值来比较,升序排序后就得到最后的结果。

同样,我们的key值也可以使用lambda表达式形式,简化以上过程如下

a = [
    ('Tony', 'A', 90),
    ('Lisa', 'C', 88),
    ('Jack', 'B', 95),
]
b = sorted(a, key=lambda t: t[-1])
print(b)

结果跟上面的一样

上面只是对形参key的使用进行了简单的演示,你也可以用在其他方面,如一些具有命名属性的对象。
还可以使用Operator模块函数来使访问器功能更容易、更便捷,这里就不过多演示了,有兴趣可以自行搜索相关资料。

升序和降序

最后就是reverse参数,用于决定列表升序还是降序排序。

a = [4, 3, 9, 6, 28, 22]
b = sorted(a, reverse=True)
print(b)

结果如下

[28, 22, 9, 6, 4, 3]

设置reverse=True就可以对列表进行降序排序。

posted @ 2020-07-31 16:08  蓝莓薄荷  阅读(1173)  评论(0编辑  收藏  举报