【Python】sorted() 函数:对可迭代对象进行排序

Python 中的 sorted() 函数

sorted() 是 Python 的一个内置函数,用于对可迭代对象(如 列表、元组、字符串、字典 等)进行排序,并返回一个新的排序后的列表(不会修改原对象)。


1. sorted() 函数的基本语法

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

参数说明

  • iterable:要排序的可迭代对象,如 listtuplestrdict(按键排序)等。
  • 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=abssorted() 按照绝对值大小 进行排序。


(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() 是更灵活的选择。

你可能感兴趣的:(Python基础,sorted,排序,python)