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

    作者:彬彬侠

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【Python】sorted() 函数详解:可迭代对象的排序与操作

    发表回复