MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python列表sorted排序的实际应用

2023-12-264.4k 阅读

Python 列表 sorted 排序的实际应用

sorted 函数基础介绍

在 Python 中,sorted() 是一个内置函数,用于对可迭代对象进行排序并返回一个新的已排序列表。其基本语法如下:

sorted(iterable, key=None, reverse=False)
  • iterable:这是要进行排序的可迭代对象,比如列表、元组、集合等。
  • key:一个可选参数,它是一个函数,会对 iterable 中的每个元素应用该函数,然后根据函数的返回值进行排序。默认值为 None,即直接对元素本身进行排序。
  • reverse:也是一个可选参数,是一个布尔值。如果设置为 True,则按降序排序;默认为 False,即升序排序。

例如,对一个简单的整数列表进行排序:

nums = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_nums = sorted(nums)
print(sorted_nums)  

上述代码运行后,会输出 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9],列表 nums 中的元素按照升序排列并赋值给了 sorted_nums

对列表中的字典进行排序

在实际开发中,经常会遇到包含字典的列表,而 sorted() 函数可以很方便地对这样的数据结构进行排序。假设我们有一个列表,其中每个元素都是表示学生信息的字典,每个字典包含 name(姓名)和 score(分数)两个键值对,现在要根据学生的分数对列表进行排序。

students = [
    {'name': 'Alice','score': 85},
    {'name': 'Bob','score': 78},
    {'name': 'Charlie','score': 92}
]

sorted_students = sorted(students, key=lambda student: student['score'])
print(sorted_students)

在这段代码中,我们使用 key 参数并结合 lambda 表达式来指定排序依据。lambda student: student['score'] 表示对于列表中的每个学生字典,以其 score 值作为排序的关键。运行上述代码,输出结果为:

[
    {'name': 'Bob','score': 78},
    {'name': 'Alice','score': 85},
    {'name': 'Charlie','score': 92}
]

如果要按分数降序排列,只需将 reverse 参数设置为 True

sorted_students_desc = sorted(students, key=lambda student: student['score'], reverse=True)
print(sorted_students_desc)

输出结果为:

[
    {'name': 'Charlie','score': 92},
    {'name': 'Alice','score': 85},
    {'name': 'Bob','score': 78}
]

按多个条件排序

有时,需要根据多个条件对列表元素进行排序。例如,还是上述学生列表,当分数相同时,要按照姓名的字母顺序进行排序。

students = [
    {'name': 'Alice','score': 85},
    {'name': 'Bob','score': 78},
    {'name': 'Charlie','score': 92},
    {'name': 'David','score': 85}
]

sorted_students = sorted(students, key=lambda student: (student['score'], student['name']))
print(sorted_students)

lambda 表达式中,我们返回一个元组 (student['score'], student['name'])sorted() 函数首先按分数排序,当分数相同时,再按姓名的字母顺序排序。输出结果为:

[
    {'name': 'Bob','score': 78},
    {'name': 'Alice','score': 85},
    {'name': 'David','score': 85},
    {'name': 'Charlie','score': 92}
]

对复杂对象列表进行排序

当列表中的元素是自定义类的实例时,同样可以使用 sorted() 函数进行排序。假设我们有一个 Point 类,表示二维平面上的点,现在要根据点到原点的距离对列表中的点进行排序。

import math


class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def distance_to_origin(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)


points = [Point(3, 4), Point(0, 0), Point(1, 1)]
sorted_points = sorted(points, key=lambda point: point.distance_to_origin())
for point in sorted_points:
    print(f"({point.x}, {point.y}) 距离原点: {point.distance_to_origin()}")

在上述代码中,我们定义了 Point 类,并实现了一个方法 distance_to_origin 来计算点到原点的距离。在 sorted() 函数中,通过 key=lambda point: point.distance_to_origin() 来指定按点到原点的距离进行排序。运行结果为:

(0, 0) 距离原点: 0.0
(1, 1) 距离原点: 1.4142135623730951
(3, 4) 距离原点: 5.0

在数据分析中的应用

在数据分析场景中,经常需要对数据进行排序以获取有价值的信息。假设我们有一个包含城市人口数据的列表,每个元素是一个包含城市名称和人口数量的元组,现在要找出人口数量最多的前几个城市。

cities = [
    ('New York', 8622357),
    ('Los Angeles', 3990456),
    ('Chicago', 2746388),
    ('Houston', 2325502),
    ('Phoenix', 1660272)
]

sorted_cities = sorted(cities, key=lambda city: city[1], reverse=True)
top_3_cities = sorted_cities[:3]
for city in top_3_cities:
    print(f"{city[0]}: {city[1]} 人口")

这段代码先按人口数量对城市列表进行降序排序,然后取前三个城市并打印。输出结果为:

New York: 8622357 人口
Los Angeles: 3990456 人口
Chicago: 2746388 人口

在文件处理中的应用

在处理文件内容时,也可能用到 sorted() 函数。假设我们有一个文本文件,每行包含一个单词及其出现的次数,格式为 单词:次数,现在要读取文件内容并按单词出现次数从高到低进行排序。

word_count_dict = {}
with open('word_count.txt', 'r') as file:
    for line in file:
        word, count = line.strip().split(':')
        word_count_dict[word] = int(count)

sorted_word_count = sorted(word_count_dict.items(), key=lambda item: item[1], reverse=True)
for word, count in sorted_word_count:
    print(f"{word}: {count}")

上述代码首先读取文件内容并构建一个字典,其中键是单词,值是单词出现的次数。然后使用 sorted() 函数对字典的项(即 (单词, 次数) 元组)按次数进行降序排序,并打印结果。

与其他数据结构结合使用

  1. 与集合结合:集合是无序的,有时我们需要将集合转换为有序的列表进行处理。例如,有一个包含一些随机整数的集合,我们想对其进行排序并输出。
num_set = {5, 2, 8, 1, 4}
sorted_nums = sorted(num_set)
print(sorted_nums)

输出结果为 [1, 2, 4, 5, 8],集合中的元素被排序成了一个列表。 2. 与生成器结合:生成器是一种特殊的迭代器,它按需生成值而不是一次性生成所有值。假设我们有一个生成器函数生成一系列数字,我们可以使用 sorted() 对其生成的值进行排序。

def number_generator():
    yield 3
    yield 1
    yield 4
    yield 1
    yield 5
    yield 9


sorted_nums = sorted(number_generator())
print(sorted_nums)

输出结果为 [1, 1, 3, 4, 5, 9],生成器生成的值被排序成了列表。

性能考虑

在处理大规模数据时,性能是一个重要的考虑因素。虽然 sorted() 函数使用方便,但对于非常大的数据集,其性能可能成为瓶颈。sorted() 函数会将整个可迭代对象加载到内存中进行排序,这在内存有限的情况下可能会导致问题。 例如,在处理一个包含数百万行数据的文件时,如果直接读取文件内容到列表并使用 sorted() 排序,可能会耗尽内存。此时,可以考虑使用外部排序算法或者分批处理数据的方式。另外,在选择排序依据的 key 函数时,也要尽量选择简单高效的函数,避免复杂的计算,以提高排序的整体性能。

稳定性分析

Python 的 sorted() 函数是稳定排序算法。这意味着在排序过程中,相等元素的相对顺序会保持不变。例如,有一个包含学生成绩的列表,其中有多个学生成绩相同,在按成绩排序后,成绩相同的学生在列表中的相对顺序与原列表相同。

students = [
    {'name': 'Alice','score': 85},
    {'name': 'Bob','score': 85},
    {'name': 'Charlie','score': 78}
]

sorted_students = sorted(students, key=lambda student: student['score'])
print(sorted_students)

输出结果为:

[
    {'name': 'Charlie','score': 78},
    {'name': 'Alice','score': 85},
    {'name': 'Bob','score': 85}
]

可以看到,成绩相同的 AliceBob,其在原列表中的相对顺序在排序后保持不变。这种稳定性在一些场景下非常重要,比如在对已经按某种次要条件排序的数据,再按主要条件排序时,能保证次要条件的顺序不受影响。

总结与拓展

通过以上各种实际应用场景的介绍,我们可以看到 sorted() 函数在 Python 编程中具有广泛的用途。无论是简单的数据结构,还是复杂的对象列表,无论是在数据分析、文件处理还是与其他数据结构结合使用,它都能发挥重要作用。同时,在使用过程中,我们要充分考虑性能和排序的稳定性等因素,以确保程序的高效和正确性。对于更复杂的排序需求,还可以结合其他算法和技术进行优化,比如在需要处理海量数据时,可以探索分布式排序等方案。在实际开发中,根据具体场景灵活运用 sorted() 函数,能极大地提高代码的简洁性和可读性。

希望以上内容能帮助你更深入地理解和应用 Python 中 sorted() 函数对列表进行排序的各种技巧和实际应用场景。在实际编程中,不断实践和探索,你会发现更多关于这个函数的妙用。同时,也鼓励大家进一步研究 Python 其他的内置函数和数据处理工具,以提升编程能力和解决实际问题的效率。