目录
一、sorted函数的常见应用场景
二、sorted函数使用注意事项
三、如何用好sorted函数?
1、sorted函数:
1-1、Python:
1-2、VBA:
2、推荐阅读:
个人主页: https://blog.csdn.net/ygb_1024?spm=1010.2135.3001.5421
一、sorted函数的常见应用场景
sorted函数在Python中非常有用,因为它允许你对各种数据结构进行排序,常见的应用场景有:
1、基本列表排序:当你有一个列表并希望根据列表中的元素值进行排序时,你可以使用sorted()函数。例如,你可能有一个包含学生分数的列表,你想知道哪个学生的分数最高或最低。
2、元组列表排序:你可以对包含元组的列表进行排序,根据元组中的某个元素值,这在处理具有多个属性的数据记录时非常有用。
3、字典列表排序:如果你有一个包含字典的列表,并希望根据字典中的某个值进行排序,你可以使用sorted()函数和lambda函数作为key参数。例如,你可能有一个包含员工信息的字典列表,并希望根据员工的年龄或薪水进行排序。
4、字符串列表排序:如果你有一个包含字符串的列表,并希望按照字母顺序或字符串长度进行排序,你可以使用sorted()函数并传递适当的key参数。例如,你可能有一个包含文件名的列表,并希望按文件名长度进行排序。
5、自定义对象排序:如果你有一个自定义对象的列表,并希望根据对象的某个属性进行排序,你可以使用sorted()函数和类的属性作为key参数,这要求你的对象是可比较的,或者你可以提供一个比较函数或方法。
6、复杂对象排序:当需要根据对象的多个属性进行排序时,可以通过在key参数中提供一个函数来实现,这个函数接受一个对象作为输入,并返回一个用于排序的值(可以是元组,以便根据多个属性排序)。
7、处理文件和数据集:在处理大量数据时,你可能需要将数据按照特定顺序进行排序,以便进行进一步的分析或可视化,sorted()函数可以用于此目的。
8、算法和数据结构:在编写算法或实现数据结构(如排序算法、搜索算法、图算法等)时,sorted()函数可能是一个有用的工具,用于验证你的实现是否正确。
9、与生成器结合使用:sorted()函数可以接受任何可迭代对象作为输入,包括生成器,这允许你在不需要将整个数据集加载到内存中的情况下进行排序。
10、排序后切片操作:结合sorted()函数和列表切片,可以很容易地获取排序后的前N个元素。
11、与列表推导式结合使用:你可以将sorted()函数与列表推导式结合使用,以创建新的已排序列表,同时根据某个条件筛选或转换元素。
二、sorted函数使用注意事项
在Python中,sorted()函数是一个非常有用的内置函数,用于对可迭代对象(如列表、元组、字典等)进行排序。相关注意事项如下:
1、原始数据不会被修改:sorted()函数返回一个新的已排序列表,而原始的可迭代对象不会被修改。
2、排序的稳定性:Python的sorted()函数在排序时保证是稳定的,即具有相同值的元素在排序后的顺序与它们在原始列表中的顺序相同。
3、排序关键字:sorted()函数允许你通过`key`参数指定一个函数,该函数将在比较元素之前应用于每个元素,这对于非数字类型(如字符串、元组、字典等)的排序特别有用。
4、排序顺序:默认情况下,sorted()函数按升序排序。你可以通过reverse=True参数将其更改为降序排序。
5、排序对象:虽然sorted()函数主要用于列表,但它也可以用于其他可迭代对象,如元组、集合和字典(当用于字典时,默认对键进行排序)。
6、性能:对于大型数据集,sorted()函数的性能可能是一个问题,在这种情况下,你可能需要考虑使用更高效的排序算法或数据结构,或者考虑是否可以在数据收集阶段就进行排序。
7、数据类型:sorted()函数可以对多种数据类型进行排序,但你需要确保你的比较操作是有意义的。例如,对于不同类型的对象(如字符串和数字),直接比较可能会导致TypeError异常,在这种情况下,你可能需要在应用sorted()之前对数据进行转换或清洗。
三、如何用好sorted函数?
要使用好Python中的sorted()函数,你需遵循以下建议:
1、理解排序的稳定性:当排序的元素中有重复值时,sorted()函数会保持它们的原始顺序(即稳定的排序),这在进行多键排序时尤其有用。
2、选择合适的排序键:通过key参数,你可以为sorted()函数提供一个函数,该函数将应用于输入可迭代对象的每个元素,并决定排序的依据。例如,你可以根据字符串的长度、列表中的第二个元素或其他任何复杂的条件进行排序。
3、使用lambda表达式:key参数经常与lambda表达式一起使用,以简洁地定义排序键,Lambda表达式允许你快速定义简单的匿名函数。
4、考虑性能:对于大型数据集,排序可能会很耗时,如果可能的话,尝试在收集数据时就保持有序,或者在需要之前对数据进行预处理以减少排序的开销。
5、使用reverse参数:如果你想要以降序而不是默认的升序进行排序,可以设置reverse=True。
6、对字典排序:你可以使用sorted()函数对字典的键或值进行排序:默认情况下,sorted(dict)会返回按键排序的键的列表;要按值排序,可以传入dict.items()并使用key参数来指定值。
7、排序自定义对象:如果你的可迭代对象包含自定义类的实例,并且你想要根据这些实例的某个属性进行排序,你可以提供一个key函数来访问该属性。
8、避免不必要的排序:在某些情况下,你可能不需要对整个数据集进行排序。例如,如果你只需要找到最大或最小的元素,可以使用max()或min()函数,它们通常比排序整个列表更快。
9、使用sorted()函数而不是列表的`.sort()`方法:sorted()函数返回一个新的已排序列表,而列表的`.sort()`方法会修改原始列表;如果你不希望修改原始数据,或者你想要保留原始数据的多个排序版本,那么使用sorted()函数会更好。
10、利用operator模块:对于简单的排序键(如按数字大小或字符串字母顺序),你可以使用operator模块中的函数作为key参数,而不是定义自己的lambda表达式,如operator.itemgetter()函数可以用于根据元组的特定项进行排序。
1、sorted函数:
1-1、Python:
# 1.函数:sorted
# 2.功能:用于对可迭代对象进行排序
# 3.语法:sorted(iterable[, key=None, reverse=False])
# 4.参数:
# 4-1、iterable(必须):表示可迭代对象,如列表、字符串、字典等
# 4-2、key(可选):表示一个函数或方法,用来指定排序规则;默认key=None,表示直接比较元素进行排序
# 4-3、reverse(可选):一个布尔值,即排序规则,默认reverse=False,表示升序排列;若设置reverse=True,则表示降序排列
# 5.返回值:返回重新排序的列表
# 6.说明:列表对象的.sort()方法和内置sorted()函数的作用基本相同,差异如下:
# 6-1、列表对象的.sort()方法:直接修改原始列表,生成新列表,影响原始列表
# 6-2、内置sorted()函数:会建立一个原始列表的副本,该副本为排序后的列表,不影响原始列表
# 7.示例:
# 用dir()函数获取该函数内置的属性和方法
print(dir(sorted))
# ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
# '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
# '__str__', '__subclasshook__', '__text_signature__']
# 用help()函数获取该函数的文档信息
help(sorted)
# 应用一:基本列表排序
# 示例1: 对整数列表进行排序
# 创建一个整数列表
numbers = [3, 6, 10, 8, 10, 24, 5, 11]
# 使用sorted()函数进行排序
sorted_numbers = sorted(numbers)
# 打印排序后的列表
print(sorted_numbers)
# [3, 5, 6, 8, 10, 10, 11, 24]
# 示例2: 对字符串列表进行排序
# 创建一个字符串列表
words = ['Myelsa', 'Jimmy', 'Lucy', 'Bruce']
# 使用sorted()函数进行排序
sorted_words = sorted(words, key=str.isupper)
# 打印排序后的列表
print(sorted_words)
# ['Myelsa', 'Jimmy', 'Lucy', 'Bruce']
# 示例3: 使用key参数按字符串长度排序
# 创建一个字符串列表
words = ['Myelsa', 'Jimmy', 'Lucy', 'Bruce']
# 使用sorted()函数和key参数,按字符串长度进行排序
sorted_words_by_length = sorted(words, key=len)
# 打印排序后的列表
print(sorted_words_by_length)
# ['Lucy', 'Jimmy', 'Bruce', 'Myelsa']
# 示例4: 对字典列表按某个键值排序
# 创建一个包含字典的列表
students = [{'name': 'Myelsa', 'age': 18}, {'name': 'Bruce', 'age': 6}, {'name': 'Jimmy', 'age': 15}]
# 使用sorted() 函数key参数,按'age'键值进行排序
sorted_students_by_age = sorted(students, key=lambda s: s['age'])
# 打印排序后的列表
print(sorted_students_by_age)
# [{'name': 'Bruce', 'age': 6}, {'name': 'Jimmy', 'age': 15}, {'name': 'Myelsa', 'age': 18}]
# 示例5: 对字典列表按多个键值排序(先按年龄,再按名字)
# 创建一个包含字典的列表
students = [{'name': 'Myelsa', 'age': 18}, {'name': 'Jimmy', 'age': 15}, {'name': 'Bruce', 'age': 6}]
# 使用sorted()函数和key参数,先按'age'键值进行排序,然后按'name'键值进行排序
sorted_students_by_age_and_name = sorted(students, key=lambda s: (s['age'], s['name']))
# 打印排序后的列表
print(sorted_students_by_age_and_name)
# [{'name': 'Bruce', 'age': 6}, {'name': 'Jimmy', 'age': 15}, {'name': 'Myelsa', 'age': 18}]
# 示例6: 使用reverse参数进行降序排序
# 创建一个整数列表
numbers = [3, 6, 10, 8, 10, 24, 5, 11]
# 使用sorted()函数和reverse参数进行降序排序
sorted_numbers_desc = sorted(numbers, reverse=True)
# 打印排序后的列表
print(sorted_numbers_desc)
# [24, 11, 10, 10, 8, 6, 5, 3]
# 应用二:元组列表排序
# 示例1: 对元组列表按照第一个元素排序
# 创建一个包含元组的列表
tuples_list = [(3, 'apple'), (1, 'banana'), (4, 'cherry'), (1, 'date')]
# 使用sorted()函数按照元组的第一个元素进行排序
sorted_tuples = sorted(tuples_list, key=lambda x: x[0])
# 打印排序后的列表
print(sorted_tuples)
# [(1, 'banana'), (1, 'date'), (3, 'apple'), (4, 'cherry')]
# 示例2: 对元组列表按照第二个元素(字符串)进行排序
# 创建一个包含元组的列表
tuples_list = [(3, 'apple'), (1, 'banana'), (4, 'cherry'), (2, 'apple')]
# 使用sorted()函数按照元组的第二个元素(字符串)进行排序
sorted_tuples = sorted(tuples_list, key=lambda x: x[1])
# 打印排序后的列表
print(sorted_tuples)
# [(3, 'apple'), (2, 'apple'), (1, 'banana'), (4, 'cherry')]
# 示例3: 对元组列表先按第一个元素(降序),然后按第二个元素(升序)进行排序
# 创建一个包含元组的列表
tuples_list = [(3, 'apple'), (1, 'banana'), (3, 'cherry'), (2, 'apple')]
# 使用sorted()函数和key参数,先按元组的第一个元素(降序),然后按第二个元素(升序)进行排序
sorted_tuples = sorted(tuples_list, key=lambda x: (-x[0], x[1]))
# 打印排序后的列表
print(sorted_tuples)
# [(3, 'apple'), (3, 'cherry'), (2, 'apple'), (1, 'banana')]
# 应用三:字典列表排序
# 示例1: 对字典列表按照某个键的值进行升序排序
# 创建一个包含字典的列表
dict_list = [
{'name': 'Myelsa', 'age': 18},
{'name': 'Bruce', 'age': 6},
{'name': 'Jimmy', 'age': 15},
]
# 使用sorted()函数和key参数,按照'age'键的值进行升序排序
sorted_dict_list = sorted(dict_list, key=lambda item: item['age'])
# 打印排序后的列表
print(sorted_dict_list)
# [{'name': 'Bruce', 'age': 6}, {'name': 'Jimmy', 'age': 15}, {'name': 'Myelsa', 'age': 18}]
# 示例2: 对字典列表按照某个键的值进行降序排序
# 创建一个包含字典的列表
dict_list = [
{'name': 'Myelsa', 'age': 18},
{'name': 'Bruce', 'age': 6},
{'name': 'Jimmy', 'age': 15},
]
# 使用sorted()函数和key参数,以及reverse参数,按照'age'键的值进行降序排序
sorted_dict_list_desc = sorted(dict_list, key=lambda item: item['age'], reverse=True)
# 打印排序后的列表
print(sorted_dict_list_desc)
# [{'name': 'Myelsa', 'age': 18}, {'name': 'Jimmy', 'age': 15}, {'name': 'Bruce', 'age': 6}]
# 示例3: 对字典列表按照多个键进行排序(先按一个键升序,后按另一个键降序)
# 创建一个包含字典的列表
dict_list = [
{'name': 'Myelsa', 'age': 18},
{'name': 'Bruce', 'age': 6},
{'name': 'Jimmy', 'age': 15},
]
# 假设我们想要先按'age'升序排序,然后按'name'降序排序
sorted_dict_list_multi = sorted(dict_list, key=lambda item: (
item['age'], -ord(item['name'][0]))) # 使用ord()将字符串的第一个字符转换为ASCII值以便排序
# 打印排序后的列表
print(sorted_dict_list_multi)
# [{'name': 'Bruce', 'age': 6}, {'name': 'Jimmy', 'age': 15}, {'name': 'Myelsa', 'age': 18}]
# 应用四:字符串列表排序
# 示例1: 对字符串列表进行升序排序
# 创建一个字符串列表
string_list = ['banana', 'apple', 'cherry', 'orange']
# 使用sorted()函数进行升序排序
sorted_strings = sorted(string_list)
# 打印排序后的列表
print(sorted_strings)
# ['apple', 'banana', 'cherry', 'orange']
# 示例2: 对字符串列表进行降序排序
# 创建一个字符串列表
string_list = ['banana', 'apple', 'cherry', 'orange']
# 使用sorted()函数和 reverse 参数进行降序排序
sorted_strings_desc = sorted(string_list, reverse=True)
# 打印排序后的列表
print(sorted_strings_desc)
# ['orange', 'cherry', 'banana', 'apple']
# 示例3: 对字符串列表按字符串长度进行排序
# 创建一个字符串列表
string_list = ['banana', 'apple', 'cherry', 'orange']
# 使用sorted()函数和key参数,按字符串长度进行排序
sorted_strings_by_length = sorted(string_list, key=len)
# 打印排序后的列表
print(sorted_strings_by_length)
# ['apple', 'banana', 'cherry', 'orange']
# 示例4: 对字符串列表按字符串中某个字符的位置进行排序
# 创建一个字符串列表
string_list = ['banana', 'apple', 'cherry', 'orange']
# 假设我们想要根据字符串中'a'的第一个出现位置进行排序
# 使用sorted()函数和自定义的key函数
def find_first_a(s):
return s.find('a') if 'a' in s else float('inf') # 如果'a'不在字符串中,返回无穷大
sorted_strings_by_a_position = sorted(string_list, key=find_first_a)
# 打印排序后的列表
print(sorted_strings_by_a_position) # 输出将会基于'a'在每个字符串中的第一个出现位置进行排序
# ['apple', 'banana', 'orange', 'cherry']
# 应用五:自定义对象排序
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return f'Person({self.name}, {self.age})'
# 创建一个Person对象的列表
people = [
Person('Myelsa', 18),
Person('Bruce', 6),
Person('Jimmy', 15),
]
# 使用sorted()函数和lambda表达式作为key函数,按age属性进行升序排序
sorted_people_by_age = sorted(people, key=lambda person: person.age)
# 打印排序后的列表
print(sorted_people_by_age)
# 使用sorted()函数和reverse参数,按age属性进行降序排序
sorted_people_by_age_desc = sorted(people, key=lambda person: person.age, reverse=True)
# 打印排序后的列表
print(sorted_people_by_age_desc)
# 如果你想先按age升序排序,然后按name升序排序(在age相同的情况下)
sorted_people_multi = sorted(people, key=lambda person: (person.age, person.name))
# 打印排序后的列表
print(sorted_people_multi)
# [Person(Bruce, 6), Person(Jimmy, 15), Person(Myelsa, 18)]
# [Person(Myelsa, 18), Person(Jimmy, 15), Person(Bruce, 6)]
# [Person(Bruce, 6), Person(Jimmy, 15), Person(Myelsa, 18)]
# 应用六:复杂对象排序
class Employee:
def __init__(self, name, department, salary):
self.name = name
self.department = department
self.salary = salary
def __repr__(self):
return f'Employee({self.name}, {self.department}, {self.salary})'
# 创建一个 Employee 对象的列表
employees = [
Employee('Lucy', 'HR', 50000),
Employee('Bruce', 'Engineering', 60000),
Employee('Jimmy', 'Engineering', 55000),
Employee('David', 'HR', 52000),
]
# 使用sorted()函数和lambda表达式作为key函数,首先按部门排序(字母顺序),然后按薪水降序排序
sorted_employees = sorted(employees, key=lambda emp: (emp.department, -emp.salary))
# 打印排序后的列表
print(sorted_employees)
# 如果你想在薪水相同时再按名字排序
sorted_employees_full = sorted(employees, key=lambda emp: (emp.department, -emp.salary, emp.name))
# 打印排序后的列表
print(sorted_employees_full)
# [Employee(Bruce, Engineering, 60000), Employee(Jimmy, Engineering, 55000), Employee(David, HR, 52000), Employee(Lucy, HR, 50000)]
# [Employee(Bruce, Engineering, 60000), Employee(Jimmy, Engineering, 55000), Employee(David, HR, 52000), Employee(Lucy, HR, 50000)]
# 应用七:处理文件和数据集
# 读取文件并分割每行的数据
with open('test.txt', 'r') as file:
data = [line.strip().split() for line in file]
# 将数据转换为可以排序的形式(例如,将年龄转换为整数)
data_with_ages = [(name, int(age)) for name, age in data]
# 使用sorted()函数对数据进行排序(按年龄升序)
sorted_data = sorted(data_with_ages, key=lambda x: x[1])
# 如果需要,你可以将排序后的数据转换回原始格式(名字和年龄作为字符串)
sorted_data_str = [(name, str(age)) for name, age in sorted_data]
# 打印排序后的数据
for name, age in sorted_data_str:
print(f"{name} {age}")
# apple 24
# banana 32
# cherry 46
# orange 58
# 应用八:算法和数据结构
# 假设我们有两个已排序的列表
list1 = [1, 3, 5, 7]
list2 = [2, 4, 6, 8]
# 使用sorted()函数和列表推导式来合并并排序两个列表
# 注意:这不是最高效的方法,因为它会重新排序合并后的列表
# 通常我们会使用双指针法或heapq.merge()来合并已排序列表
merged_list = sorted(list1 + list2)
print(merged_list)
# 更高效的方法(不使用sorted())
def merge_sorted_lists(list1, list2):
merged = []
i = j = 0
while i < len(list1) and j < len(list2):
if list1[i] < list2[j]:
merged.append(list1[i])
i += 1
else:
merged.append(list2[j])
j += 1
# 添加剩余的元素(如果有的话)
merged.extend(list1[i:])
merged.extend(list2[j:])
return merged
# 使用更高效的方法合并列表
efficient_merged_list = merge_sorted_lists(list1, list2)
print(efficient_merged_list)
# [1, 2, 3, 4, 5, 6, 7, 8]
# [1, 2, 3, 4, 5, 6, 7, 8]
# 应用九:与生成器结合使用
# 定义一个生成器,它生成从1到10的平方数
def squares_generator(n):
for i in range(1, n + 1):
yield i ** 2
# 使用sorted()函数与生成器结合,按从小到大的顺序对平方数进行排序
sorted_squares = sorted(squares_generator(10))
# 打印排序后的平方数
print(sorted_squares)
# 另一个示例:使用sorted()和lambda表达式与生成器结合,按从大到小的顺序对平方数进行排序
sorted_squares_desc = sorted(squares_generator(10), reverse=True)
# 打印按降序排序后的平方数
print(sorted_squares_desc)
# 如果你想要根据某种复杂的逻辑进行排序,你可以使用lambda表达式
# 假设我们想要根据平方数的奇偶性进行排序,奇数在前,偶数在后
sorted_squares_odd_even = sorted(squares_generator(10), key=lambda x: (x % 2, x))
# 打印按奇偶性排序后的平方数
print(sorted_squares_odd_even)
# 注意:由于奇数和偶数各自内部还是按数值大小排序的,所以结果可能因Python版本或实现细节略有不同
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# [100, 81, 64, 49, 36, 25, 16, 9, 4, 1]
# [4, 16, 36, 64, 100, 1, 9, 25, 49, 81]
# 应用十:排序后切片操作
# 假设我们有一个包含整数的列表
numbers = [3, 6, 10, 8, 10, 24, 5, 11]
# 使用sorted()函数对列表进行排序
sorted_numbers = sorted(numbers)
# 打印排序后的整个列表
print("Sorted numbers:", sorted_numbers)
# 使用切片操作获取排序后列表的前三个元素
first_three = sorted_numbers[:3]
# 打印切片后的列表
print("First three elements:", first_three)
# 使用切片操作获取排序后列表的中间三个元素(如果列表长度大于或等于5)
middle_three = sorted_numbers[1:4] # 注意:切片操作是左闭右开的
# 打印切片后的列表
print("Middle three elements:", middle_three)
# 使用切片操作获取排序后列表的最后两个元素
last_two = sorted_numbers[-2:]
# 打印切片后的列表
print("Last two elements:", last_two)
# 注意:切片操作不会修改原始列表,而是返回一个新的列表切片
print("Original list is unchanged:", numbers)
# Sorted numbers: [3, 5, 6, 8, 10, 10, 11, 24]
# First three elements: [3, 5, 6]
# Middle three elements: [5, 6, 8]
# Last two elements: [11, 24]
# Original list is unchanged: [3, 6, 10, 8, 10, 24, 5, 11]
# 应用十一:与列表推导式结合使用
# 示例1:将字符串列表转换为整数列表并排序
# 假设我们有一个包含数字的字符串列表
string_numbers = ['3', '6', '10', '8', '10', '24', '5', '11']
# 使用列表推导式将字符串转换为整数,并使用sorted()排序
sorted_int_numbers = sorted(int(num) for num in string_numbers)
print(sorted_int_numbers)
# [3, 5, 6, 8, 10, 10, 11, 24]
# 示例2:根据字典列表中某个键的值进行排序
# 假设我们有一个字典列表,每个字典代表一个学生,包含姓名和分数
students = [{'name': 'Myelsa', 'score': 98},
{'name': 'Bruce', 'score': 85},
{'name': 'Jimmy', 'score': 95}]
# 使用列表推导式和sorted()按分数排序学生(降序)
sorted_students_desc = sorted(students, key=lambda s: s['score'], reverse=True)
for student in sorted_students_desc:
print(student['name'], student['score'])
# Myelsa 98
# Jimmy 95
# Bruce 85
# 示例3:根据元组列表中元组的多个元素进行排序
# 假设我们有一个元组列表,每个元组包含两个数字
tuples_list = [(3, 6), (10, 8), (10, 24), (5, 11)]
# 使用列表推导式和sorted()先按第一个元素排序,然后按第二个元素排序
sorted_tuples = sorted(tuples_list, key=lambda t: (t[0], t[1]))
print(sorted_tuples)
# [(3, 6), (5, 11), (10, 8), (10, 24)]
1-2、VBA:
略,待后补。
2、推荐阅读:
2-1、Python-VBA函数之旅-round()函数
Python算法之旅:Algorithm
Python函数之旅:Functions