Python 输入多个名字,按字母排序

方法一:一次性输入,split 分割 names = input("请输入多个名字(用空格分隔):").split() names.sort(key=str.lower) # 按字母顺序排序(忽略大小写) print("排序后的名字:", names) names=input("请输入多个名字(用空格分隔):").split() names.sort(key=str.lower) print("排序后的名字",names) --介绍一下这个.sort 方法

ChatGPT 说:

燎然,.sort()Python 列表(list)内置的方法 ,专门用来原地排序列表里的元素。

1. 基本语法

ini 复制代码
python复制编辑list.sort(key=None, reverse=False)
  • key:一个函数,用来指定排序的规则(比较的依据)

  • reverse:布尔值,False 表示升序(默认),True 表示降序

2. 特点

  1. 原地排序(in-place)

    • .sort() 会直接修改原列表,不会返回一个新的列表

    • 返回值是 None,所以不要写成 new_list = list.sort()(这样 new_list 会是 None

  2. 排序规则

    • 默认按元素的ASCII/Unicode 编码顺序排序

    • 字符串会区分大小写(大写字母的 ASCII 值比小写字母小)

    • 可以通过 key=str.lower 忽略大小写

  3. 稳定排序(stable sort)

    • 当两个元素的 key 值相等时,保持它们原本的相对顺序

3. 例子

scss 复制代码
python复制编辑# 基本排序
nums = [5, 2, 9, 1]
nums.sort()
print(nums)  # [1, 2, 5, 9]

# 降序排序
nums.sort(reverse=True)
print(nums)  # [9, 5, 2, 1]

# 忽略大小写排序
names = ["Tom", "alice", "Bob"]
names.sort(key=str.lower)
print(names)  # ['alice', 'Bob', 'Tom']

# 按字符串长度排序
words = ["banana", "apple", "pear"]
words.sort(key=len)
print(words)  # ['pear', 'apple', 'banana']

4. .sort() 和 sorted() 的区别

.sort()(方法)

sorted()(函数)

只能用于列表

可用于任何可迭代对象(list, tuple, dict, set 等)

修改原列表

返回一个新的已排序列表

返回值是 None

返回新列表

例子:

scss 复制代码
python复制编辑nums = [3, 1, 2]
sorted_nums = sorted(nums)  # 新列表
print(sorted_nums)  # [1, 2, 3]
print(nums)         # [3, 1, 2]

nums.sort()  # 原地修改
print(nums)  # [1, 2, 3]

如果你愿意,我可以帮你画一个 .sort() 的底层执行流程图 ,让你更直观地看到它是怎么比较和交换的,这样你就能自己写出排序算法了。

你要我画吗?这样学排序就更快了。

您说:

为什么False 表示默认 而不是True 表示默认呢?new_list = list.sort() --list.sort()结果是什么呢 不是原列表修改后的列表吗? 那把修改后的原列表赋值给 new_list 为什么会出错;key=str.lower 又是什么写发,我怎么知道要写str.lower , lower 是方法吗,后面要加括号吗

ChatGPT 说:

燎然,你问的这几个细节正好是 .sort() 容易搞混的地方,我给你拆开讲清楚。

1. 为什么 reverse=False 是默认

  • .sort() 默认是升序 (小 → 大),所以 reverse=False 表示不要反转排序结果

  • 如果你想降序(大 → 小),才需要手动写 reverse=True

  • Python 的设计哲学是"默认安全、直观",所以升序是最常用的,就设为默认

例子:

ini 复制代码
python复制编辑nums = [3, 1, 2]
nums.sort()               # 升序
print(nums)  # [1, 2, 3]

nums.sort(reverse=True)   # 降序
print(nums)  # [3, 2, 1]

2. new_list = list.sort() 为什么不行

.sort() 的返回值永远是 None ,它只是直接修改原列表,不返回排序后的新列表。

例子:

scss 复制代码
python复制编辑nums = [3, 1, 2]
result = nums.sort()
print(result)  # None
print(nums)    # [1, 2, 3]  原列表被修改了

重点 :如果你想要新列表,不改变原列表,要用 sorted()

scss 复制代码
python复制编辑nums = [3, 1, 2]
new_list = sorted(nums)
print(new_list)  # [1, 2, 3]
print(nums)      # [3, 1, 2]

3. key=str.lower 是什么写法

  • key 参数接收一个函数,这个函数会应用到列表的每个元素上,用来决定排序依据。

  • str.lower 是字符串的方法引用,表示"把字符串转成小写"。

  • 这里不加括号 (),因为我们不是要马上执行它,而是把它的地址传给 sort() ,让 sort() 在排序时去调用它。

例子:

scss 复制代码
python复制编辑names = ["Tom", "alice", "Bob"]
names.sort(key=str.lower)  # 按忽略大小写排序
print(names)  # ['alice', 'Bob', 'Tom']

等价于:

scss 复制代码
python复制编辑def ignore_case(s):
    return s.lower()

names = ["Tom", "alice", "Bob"]
names.sort(key=ignore_case)
print(names)  # ['alice', 'Bob', 'Tom']

4. lower() 是方法吗?

是的,lower()字符串方法,作用是把字符串转成小写。

bash 复制代码
python复制编辑print("ABC".lower())  # abc
print("aBc".lower())  # abc

区别:

  • str.lower方法引用(给别人用,暂时不执行)

  • "ABC".lower()方法调用(立刻执行,返回小写结果)

✅ 总结:

  1. reverse=False 默认升序

  2. .sort() 修改原列表,不返回新列表(返回 None

  3. key=str.lower 是把方法引用传给 sort(),不加括号

  4. lower() 是字符串方法,加括号时会执行

我建议你下一步试一个自己写 key 函数的版本 ,比如按名字长度排序 ,这样你就完全掌握 key 参数了。

我可以帮你出一个这种进阶小练习,你要做吗?这样你以后见到 key 参数就完全不怕了。

您说:

key=len 前面之所以不是 str.len, 是因为len本身是函数不是字符串的方法,而str.lower 是因为lower本身不是函数,是字符串里面的一个方法,所以需要写str. 。这个是不是跟import u是一个意思呀?

ChatGPT 说:

燎然,你这个理解方向基本对,我帮你再捋顺一下,让它更清楚。

1. 为什么 key=len 不是 str.len

  • lenPython 内置函数(built-in function),它本来就能处理很多类型(字符串、列表、元组...):

    python 复制代码
    python复制编辑len("abc")   # 3
    len([1,2,3]) # 3

    所以直接写 key=len 就行,不用加 str.

  • lower字符串的实例方法,只属于字符串这个类型,不能直接用:

    bash 复制代码
    python复制编辑lower("ABC")  # ❌ 报错
    "ABC".lower() # ✅ 正确

    如果你想把它当 key 用,就得告诉 Python 这是字符串的方法,所以写成 str.lower(相当于说"去 String 类里面找 lower 方法")。

2. 方法引用 vs 函数引用

  • 函数 (function):定义在全局,比如 len()max()

  • 方法 (method):定义在某个类里面,比如 str.lower()list.append()

当你写:

ini 复制代码
python复制编辑key=len

是在传递一个函数引用

当你写:

ini 复制代码
python复制编辑key=str.lower

是在传递一个方法引用(属于 str 类)

3. 你说的"是不是跟 import u 一个意思"

你是想说 import 的模块名 + 方法名 这种用法吧,其实有点类似:

  • math.sqrt → 从 math 模块里拿 sqrt 函数

  • str.lower → 从 str 类里拿 lower 方法

本质上都是:

"先找到命名空间(模块/类),再去里面找函数或方法的引用"。

4. 总结表

写法

含义

len

内置函数,能直接用

str.lower

字符串类的方法引用,要加类名

math.sqrt

从模块里取函数引用,要加模块名

"abc".lower()

调用字符串实例的方法(执行了)

相关推荐
程序员爱钓鱼24 分钟前
Go语言实战案例:文件上传服务
后端·go·trae
程序员爱钓鱼25 分钟前
Go语言实战案例:表单提交数据解析
后端·go·trae
小楓120136 分钟前
後端開發技術教學(三) 表單提交、數據處理
前端·后端·html·php
bobz9652 小时前
windows 配置 conda 环境变量
后端
回家路上绕了弯2 小时前
线程池优化实战:从性能瓶颈到极致性能的演进之路
java·后端
bobz9652 小时前
pycharm pro 安装插件失败
后端
丘山子3 小时前
如何规避 A/B Testing 中的致命错误?何时进行 A/B 测试?
前端·后端·面试
用户84913717547164 小时前
JDK 17 实战系列(第4期):安全性与稳定性增强详解
java·后端·性能优化
苏三的开发日记4 小时前
centos如何使用高版本gcc
后端
自由的疯4 小时前
java程序员怎么从Python小白变成Python大拿?(三)
java·后端·trae