Python忽略元音字母对列表按字母排序的实现逻辑问题求教
Python排序代码问题解答
先修正原代码的隐藏问题
你提供的代码里元音列表的定义存在逻辑错误,会导致过滤元音完全不生效:
# 错误写法:vowels是只有1个元素的列表,元素是完整的元音字符串 vowels = ['aeiouAEIOU'] # 正确写法:vowels直接定义为字符串,才能支持单个字符的存在判断 vowels = 'aeiouAEIOU'
原错误写法下,c not in vowels的判断逻辑是「单个字符是否等于列表里的整个长字符串aeiouAEIOU」,显然永远为真,相当于完全没有过滤元音。
问题1:逐字符遍历的实现逻辑
Python中字符串本身就是可迭代的字符序列,不需要额外做拆分单词的操作:
你代码里的生成器表达式c for c in s if c not in vowels中,for c in s会直接迭代字符串s的每一个字符,自动完成逐字符读取的逻辑,这是Python内置的字符串迭代特性。
问题2:排序规则与元音的影响
sorted函数的排序逻辑是:对列表里的每个元素,先通过key参数传入的函数计算出对应的排序键,再仅根据排序键的大小对原元素进行排序,原元素本身不会被修改。
在你这套规则下的排序逻辑如下:
- 每个单词的排序键是「去掉所有元音后,剩下的辅音按原有顺序拼接成的新字符串」,元音在计算排序键时会被直接丢弃,完全不参与排序权重的计算
- 举个实际计算的例子,以你给出的列表
['alpha', 'beta']为例:alpha去掉元音a、a后得到的排序键是lphbeta去掉元音e、a后得到的排序键是bt- 字符串字典序比较中
bt<lph,所以最终排序结果是['beta', 'alpha']
- 元音对结果的影响:排序时完全忽略所有元音的存在,两个单词哪怕元音差异很大,只要去掉元音后的辅音序列完全相同,排序时就会被视为优先级相等,二者的相对顺序和原列表中的顺序保持一致(Python的
sorted是稳定排序)。
内容的提问来源于stack exchange,提问作者NguoiMelb Ho
相关产品推荐
相关产品推荐

