欢迎访问宙启技术站
智能推送

如何在Python中实现列表排序函数?

发布时间:2023-06-10 06:36:22

Python提供了多种排序函数,包括内置函数和标准库模块中的函数。本文将介绍如何使用Python实现列表排序函数。

一、使用内置函数sorted()

Python提供了内置函数sorted(),可以对列表进行排序,并返回一个新的排序后的列表,原始列表不会被改变。

语法

sorted(iterable, *, key=None, reverse=False)

参数说明

iterable:可迭代对象,如列表、元组、字符串、集合、字典等。

key:用于指定排序的依据,可以是一个函数或lambda表达式,也可以是字符串(表示按照属性或键值排序)。

reverse:是否反转排序顺序,默认为False(升序排序),True表示降序排序。

示例代码

# 对列表进行排序

l = [5, 2, 8, 3, 7]

l_sorted = sorted(l)

print(l_sorted)  # [2, 3, 5, 7, 8]

# 对元组进行排序

t = (5, 2, 8, 3, 7)

t_sorted = sorted(t)

print(t_sorted)  # [2, 3, 5, 7, 8]

# 对字符串进行排序

s = "python"

s_sorted = sorted(s)

print(s_sorted)  # ['h', 'n', 'o', 'p', 't', 'y']

# 对字典进行排序(按键值)

d = {'a': 5, 'b': 2, 'c': 8, 'd': 3, 'e': 7}

d_sorted = sorted(d.items(), key=lambda x: x[1])

print(d_sorted)  # [('b', 2), ('d', 3), ('a', 5), ('e', 7), ('c', 8)]

二、使用标准库模块中的函数

除了内置函数外,Python标准库中也提供了一些排序函数,如heapq、bisect、array等。

1. heapq模块

heapq模块提供了堆排序算法,可以在O(n log n)时间内对列表进行排序,原始列表也会被改变。堆排序算法是一种基于完全二叉树的排序方法,其分为大根堆和小根堆两种。

语法

import heapq

heapq.heapify(iterable)

heapq.heappush(heap, item)

heapq.heappop(heap)

heapq.heappushpop(heap, item)

heapq.nlargest(n, iterable, key=None)

heapq.nsmallest(n, iterable, key=None)

参数说明

heapq.heapify(iterable):将可迭代对象转化为堆。

heapq.heappush(heap, item):往堆中插入一个元素。

heapq.heappop(heap):从堆中移除并返回堆中最小元素。

heapq.heappushpop(heap, item):往堆中插入一个元素并移除堆中最小元素。

heapq.nlargest(n, iterable, key=None):返回列表中最大的n个元素。

heapq.nsmallest(n, iterable, key=None):返回列表中最小的n个元素。

示例代码

# 对列表进行排序

l = [5, 2, 8, 3, 7]

heapq.heapify(l)

l_sorted = [heapq.heappop(l) for i in range(len(l))]

print(l_sorted)  # [2, 3, 5, 7, 8]

# 对元组进行排序

t = (5, 2, 8, 3, 7)

t_sorted = heapq.nlargest(len(t), t)

print(t_sorted)  # [8, 7, 5, 3, 2]

# 对字典进行排序(按键值)

d = {'a': 5, 'b': 2, 'c': 8, 'd': 3, 'e': 7}

d_sorted = heapq.nsmallest(len(d), d.items(), key=lambda x: x[1])

print(d_sorted)  # [('b', 2), ('d', 3), ('a', 5), ('e', 7), ('c', 8)]

2. bisect模块

bisect模块提供了二分查找算法,可以在O(log n)时间内查找插入元素的位置,可以用于对有序列表进行插入、删除和查找操作。

语法

import bisect

bisect.bisect_left(a, x, lo=0, hi=len(a))

bisect.bisect_right(a, x, lo=0, hi=len(a))

bisect.bisect(a, x, lo=0, hi=len(a))

参数说明

a:有序列表。

x:待查找或插入的元素。

lo:起始索引,默认为0。

hi:结束索引,默认为列表长度。

bisect.bisect_left(a, x, lo=0, hi=len(a)):查找并返回元素x在有序列表a中应该插入的左侧索引。

bisect.bisect_right(a, x, lo=0, hi=len(a)):查找并返回元素x在有序列表a中应该插入的右侧索引。

bisect.bisect(a, x, lo=0, hi=len(a)):查找并返回元素x在有序列表a中应该插入的任意一个索引。

示例代码

# 对列表进行排序(使用insert()方法)

l = [5, 2, 8, 3, 7]

for i in range(1, len(l)):

    j = i

    while j > 0 and l[j] < l[j-1]:

        l[j], l[j-1] = l[j-1], l[j]

        j -= 1

print(l)  # [2, 3, 5, 7, 8]

# 对列表进行排序(使用bisect模块)

l = [5, 2, 8, 3, 7]

l_sorted = []

for i in l:

    bisect.insort_left(l_sorted, i)

print(l_sorted)  # [2, 3, 5, 7, 8]

# 对字典进行排序(按键值)

d = {'a': 5, 'b': 2, 'c': 8, 'd': 3, 'e': 7}

d_sorted = sorted(d.items(), key=lambda x: x[1])

print(d_sorted)  # [('b', 2), ('d', 3), ('a', 5), ('e', 7), ('c', 8)]

3. array模块

array模块提供了一种高效的存储和操作基本数据类型的方式,可以用于对数字列表进行排序,但不能用于存储和操作复杂的数据结构。

语法

import array

array.array(typecode[, initializer])

参数说明

typecode:数组元素的类型代码,可以是b、B、h、H、i、I、l、L、f、d等。

initializer:可选参数,用于初始化数组的元素。

示例代码

# 对列表进行排序

l = [5, 2, 8, 3, 7]

a = array.array('i', l)

a_sorted = sorted(a)

l_sorted = list(a_sorted)

print(l_sorted)  # [2, 3, 5, 7, 8]

# 对元组进行排序

t = (5, 2, 8, 3, 7)

a = array.array('i', t)

a_sorted = sorted(a, reverse=True)

t_sorted = tuple(a_sorted)

print(t_sorted)  # (8, 7, 5, 3, 2)

# 对字典进行排序(按键值)

d = {'a': 5, 'b': 2, 'c': 8, 'd': 3, 'e': 7}

a = array.array('i', d.values())

a_sorted = sorted(a)

d_sorted = dict(zip(d.keys(), a_sorted))

print(d_sorted)  # {'a': 2, 'b': 3, 'c': 5, 'd': 7, 'e': 8}

注意事项

1. 类型兼容性

上述排序函数在使用时需要注意类型的兼容性,如在使用bisect模块对列表进行排序时,插入的元素类型应和列表元素类型相同。

2. 对原始