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()

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

相关推荐
你的人类朋友37 分钟前
Let‘s Encrypt 免费获取 SSL、TLS 证书的原理
后端
老葱头蒸鸡39 分钟前
(14)ASP.NET Core2.2 中的日志记录
后端·asp.net
李昊哲小课1 小时前
Spring Boot 基础教程
java·大数据·spring boot·后端
码事漫谈2 小时前
C++内存越界的幽灵:为什么代码运行正常,free时却崩溃了?
后端
Swift社区2 小时前
Spring Boot 3.x + Security + OpenFeign:如何避免内部服务调用被重复拦截?
java·spring boot·后端
90后的晨仔2 小时前
Mac 上配置多个 Gitee 账号的完整教程
前端·后端
码事漫谈2 小时前
AI智能体平台选型指南:从技术架构到商业落地的全景洞察
后端
青柠编程3 小时前
基于 Spring Boot 的医疗病历信息交互平台架构设计
java·spring boot·后端
chenyuhao20244 小时前
vector深度求索(上)实用篇
开发语言·数据结构·c++·后端·算法·类和对象
程序新视界4 小时前
MySQL中的数据去重,该用DISTINCT还是GROUP BY?
数据库·后端·mysql