list.sort()返回None的问题排查及特殊字符串排序需求
搞定list.sort()返回None的坑,同时实现自定义排序需求
为啥list.sort()会返回None?
这其实是Python的设计逻辑哦!list.sort()是原地排序方法——它直接修改你调用的原列表,不会生成新列表,所以返回值固定是None。你大概率是犯了这个常见错误:把sort()的返回值赋值给了某个变量,比如写了result = my_list.sort(),这时候result就会是None,但原列表my_list其实已经被悄悄排好序啦!
如果想要得到一个全新的排序列表,推荐用内置函数sorted(),它会返回排序后的新列表,原列表完全不受影响:
my_list = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] sorted_list = sorted(my_list)
实现把以'x'开头的字符串放最前面的排序
接下来解决你的编程题需求:让所有以'x'开头的字符串排在最前面,剩下的按正常规则排序。这里可以利用sorted()(或list.sort())的key参数来定义自定义排序规则,非常灵活。
方法一:用元组作为排序键(最简洁)
我们可以给每个字符串生成一个排序用的元组:
- 如果字符串以'x'开头,元组第一个元素设为0,这样这类字符串会被优先排序;
- 否则元组第一个元素设为1,后面跟着字符串本身,这样同一组内会按字符串默认的字典序排序。
代码示例(用sorted(),避免None问题):
def sort_x_first(strings): return sorted(strings, key=lambda s: (0, s) if s.startswith('x') else (1, s)) # 测试你的示例输入 input_list = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] print(sort_x_first(input_list)) # 输出:['xanadu', 'xyz', 'aardvark', 'apple', 'mix']
要是你非要用list.sort(),记得不要拿它的返回值,直接操作原列表就行:
input_list = ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] input_list.sort(key=lambda s: (0, s) if s.startswith('x') else (1, s)) print(input_list) # 直接打印修改后的原列表
方法二:拆分列表再合并(更直观)
另一种思路是把原列表拆成两个部分:以'x'开头的字符串、其他字符串,分别排序后再合并,逻辑更直白:
def sort_x_first(strings): x_group = sorted([s for s in strings if s.startswith('x')]) other_group = sorted([s for s in strings if not s.startswith('x')]) return x_group + other_group # 测试同样能得到正确结果
划重点
- 别再把
list.sort()的返回值赋值给变量啦!它只修改原列表,返回None;想要新列表就用sorted(); - 自定义排序用
key参数是最优解,元组排序的方式能轻松实现“分组优先”的排序需求。
内容的提问来源于stack exchange,提问作者Joseph g.
相关产品推荐
相关产品推荐

