单词列表排序

Admin
发布于 2026-05-21 / 3 阅读
0
0
"""
拆分字符串成单词列表,再按长度排序
"""

def sort_sentence(sentence):
    return sorted(sentence.split(), key=len)

if __name__ == '__main__':
    sentence = 'The quick brown fox jumps over the lazy dog'
    print(sort_sentence(sentence))
    # ['The', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dog']

下面我来为你详细解释这段Python代码的含义、实现原理、用途以及需要注意的事项。

### 一、 代码含义

这段代码的核心功能是:**接收一个英文句子字符串,将其拆分为单词列表,并根据单词的长度由短到长进行排序,最后返回排序后的列表。**

### 二、 实现原理

代码的核心逻辑集中在 sort_sentence 函数中的 sorted(sentence.split(), key=len) 这一行,它经历了以下几个步骤:

1. *sentence.split()(字符串拆分)**:

- split() 是Python字符串的内置方法。如果不传入参数,它会默认以**任意空白字符**(包括空格、制表\t、换行\n等)作为分隔符,将字符串切分成多个部分,并返回一个列表。

- 例如'The quick brown fox' 会被拆分成 ['The', 'quick', 'brown', 'fox']

2. *sorted(..., key=len)(排序)**:

- sorted() 是Python的内置高阶函数,用于对可迭代对象进行排序,并返回一个新的列表(不会修改原列表)。

- key=len 是排序的依据key 参数接受一个函数,这里传入了内置的 len 函数。这意味着在排序时sorted 会先对列表中的每个单词调用 len() 函数计算其长度,然后根据长度的大小进行**升序(从小到大)**排序。

3. *if __name__ == '__main__':(主入口判断)**:

- 这是Python的常见编写习惯。它确保只有当该脚本被直接运行时,才会执行下面的测试代码;如果该脚本作为模块被其他文件导入,则不会自动执行测试代码。

### 三、 用途

这种按单词长度排序的逻辑在实际开发中有很多应用场景,例如:

- 文本分析与自然语言处理(NLP):分析句子中单词长度的分布,提取特定长度的关键词。

- 排版与UI显示:在空间有限的情况下,优先显示较短的词汇,或者将长单词进行缩写处理。

- 教育/游戏开发:比如编写拼字游戏或打字练习软件,按长度分级显示单词以增加难度梯度。

### 四、 注意事项

虽然这段代码非常简洁,但在实际使用中需要注意以下几个细节:

1. 长度相同时的排序顺序是不确定的(不稳定来源)

- 当两个单词长度相同时(如 'The' 和 'fox' 都是3个字母),Python 3 的 sorted 会保持它们的原始相对顺序(稳定排序)。但在旧版Python或不同底层实现中,长度相同的单词可能不会按字母表顺序排列。如果你希望长度相同的情况下按字母表排序,可以修改为:

```python

sorted(sentence.split(), key=lambda x: (len(x), x))

```

2. 标点符号会被算作单词的一部分

- split() 只能识别空白字符,不能识别标点。如果句子中包含标点,例如 'Hello, world!',拆分后得到的是 ['Hello,', 'world!']。此时 len('Hello,') 为 6,逗号和感叹号会被计入单词长度。

- 改进方法:如果需要纯粹的字母长度,可以在拆分前去除标点,或者使用正则表达式提取单词:

```python

import re

words = re.findall(r'\b\w+\b', sentence) # 只提取字母数字组成的单词

return sorted(words, key=len)

```

3. 对中文支持有限

- 这段代码适用于由空格分隔的语言(如英文)。对于中文,词语之间没有空格split() 会把整句话当成一个“单词”,导致排序失效。如果处理中文,需要使用分词库(如 jieba)。

4. 降序排序

- 当前代码默认是升序(从短到长)。如果需要从长到短排序,只需添加 reverse=True 参数:

```python

sorted(sentence.split(), key=len, reverse=True)

```

希望这个详细的解释对你有所帮助!如果你还有其他关于代码的问题,随时可以问我。


评论