【Python】sorted() 函数详解:可迭代对象的排序与操作
Python 中的 sorted()
函数
sorted()
是 Python 的一个内置函数,用于对可迭代对象(如 列表、元组、字符串、字典 等)进行排序,并返回一个新的排序后的列表(不会修改原对象)。
1. sorted()
函数的基本语法
sorted(iterable, key=None, reverse=False)
参数说明
iterable
:要排序的可迭代对象,如 list
、tuple
、str
、dict
(按键排序)等。key
(可选):指定排序依据的函数,默认为 None
,即按默认规则排序。reverse
(可选):是否降序排序,默认为 False
(升序)。若 True
,则降序排序。返回值
list
,不会改变原来的 iterable
。2. sorted()
基本示例
(1) 对列表进行排序
numbers = [5, 2, 9, 1, 7]
sorted_numbers = sorted(numbers)
print(sorted_numbers)
输出:
[1, 2, 5, 7, 9]
原列表
numbers
不会被修改,sorted()
返回一个新的排序列表。
(2) 逆序排序
使用 reverse=True
进行降序排序:
sorted_numbers_desc = sorted(numbers, reverse=True)
print(sorted_numbers_desc)
输出:
[9, 7, 5, 2, 1]
(3) 对字符串排序
字符串会按照 ASCII 码 进行排序:
chars = "python"
sorted_chars = sorted(chars)
print(sorted_chars)
输出:
['h', 'n', 'o', 'p', 't', 'y']
sorted()
返回的是一个列表,如果想要得到字符串,可以使用''.join(sorted_chars)
。
3. key
参数:自定义排序规则
key
允许你提供一个函数,对元素进行自定义排序。
(1) 按字符串长度排序
words = ["banana", "apple", "cherry", "blueberry"]
sorted_words = sorted(words, key=len)
print(sorted_words)
输出:
['apple', 'banana', 'cherry', 'blueberry']
key=len
表示按照字符串长度进行排序。
(2) 按绝对值大小排序
numbers = [-10, 5, -3, 2, -8]
sorted_numbers = sorted(numbers, key=abs)
print(sorted_numbers)
输出:
[2, -3, 5, -8, -10]
key=abs
让sorted()
按照绝对值大小 进行排序。
(3) 按某个属性排序(适用于字典和对象)
假设有一组字典:
students = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 22},
{"name": "Charlie", "age": 23}
]
可以按照 age
进行排序:
sorted_students = sorted(students, key=lambda x: x["age"])
print(sorted_students)
输出:
[
{'name': 'Bob', 'age': 22},
{'name': 'Charlie', 'age': 23},
{'name': 'Alice', 'age': 25}
]
4. sorted()
与 sort()
的区别
方法 | 返回值 | 是否修改原列表 | 适用对象 |
---|---|---|---|
sorted() |
返回一个新的排序列表 | 不会 修改原列表 | 任何可迭代对象 |
.sort() |
返回 None |
会 直接修改原列表 | 仅适用于 list |
示例
numbers = [5, 3, 8, 1]
sorted_numbers = sorted(numbers) # 不修改原列表
print(sorted_numbers) # [1, 3, 5, 8]
print(numbers) # [5, 3, 8, 1]
numbers.sort() # 直接修改原列表
print(numbers) # [1, 3, 5, 8]
5. sorted()
高级用法
(1) 按多个条件排序
如果想要 先按年龄排序,再按名字排序,可以使用 tuple
作为 key
:
students = [
{"name": "Alice", "age": 25},
{"name": "Bob", "age": 22},
{"name": "Charlie", "age": 23},
{"name": "Alice", "age": 22}
]
sorted_students = sorted(students, key=lambda x: (x["age"], x["name"]))
print(sorted_students)
输出:
[
{'name': 'Alice', 'age': 22},
{'name': 'Bob', 'age': 22},
{'name': 'Charlie', 'age': 23},
{'name': 'Alice', 'age': 25}
]
先按
age
排序,如果age
相同,再按name
排序。
(2) 按字符串中字符出现频率排序
text = "banana"
sorted_text = sorted(text, key=lambda c: text.count(c), reverse=True)
print("".join(sorted_text))
输出:
aaannb
按照字符在
text
中的出现次数排序(从多到少)。
(3) 对字典的键值排序
data = {"apple": 3, "banana": 1, "cherry": 2}
# 按 key 排序
sorted_by_key = sorted(data.items(), key=lambda x: x[0])
# 按 value 排序
sorted_by_value = sorted(data.items(), key=lambda x: x[1])
print(sorted_by_key) # [('apple', 3), ('banana', 1), ('cherry', 2)]
print(sorted_by_value) # [('banana', 1), ('cherry', 2), ('apple', 3)]
总结
功能 | 示例 |
---|---|
基本排序 | sorted([5, 2, 9, 1]) |
降序排序 | sorted([5, 2, 9, 1], reverse=True) |
按字符串长度排序 | sorted(["apple", "banana"], key=len) |
按绝对值排序 | sorted([-10, 5, -3], key=abs) |
按字典属性排序 | sorted(students, key=lambda x: x["age"]) |
按多个条件排序 | sorted(students, key=lambda x: (x["age"], x["name"])) |
按字符频率排序 | sorted("banana", key=lambda c: "banana".count(c), reverse=True) |
🔹 sorted()
适用于
如果需要就地排序(原地修改列表),请使用 .sort()
方法。否则,sorted()
是更灵活的选择。
作者:彬彬侠