在:
case-insensitive list sorting, without lowercasing the result?
我见过两种解决方案:
(设;假设输入是utf-8字符串的列表,例如['z1', 'A1', 'a0', 'bC']
)
L.sort(key = str.lower);
L.sort(key = lambda s: s.lower());
有什么区别? 哪个更好或更“pythonic”?
(因为我标记的问题是关于python-3.x
。所有与python 2特有的行为相关的评论都是受欢迎的,但请注意)
答案 0 :(得分:4)
str.lower
是str
类型的未绑定方法,lambda s: s.lower()
是匿名函数。最终效果是相同的:对于L
中的每个元素,调用key
callable,传入元素。
如果您没有排序字符串,效果可能会有所不同。 str.lower
方法仅适用于字符串,而匿名lambda函数适用于任何具有.lower()
方法的函数;例如,如果混合使用bytes
和str
,请使用此功能。
我更喜欢第一个版本,它更短,更快一点。此外,如果我的值不是字符串,那么它会抛出错误,通常你想要的。
答案 1 :(得分:2)
第三个选项是来自methodcaller
模块的operator
。
from operator import methodcaller
L.sort(key=methodcaller('lower'))
它相当于它所做的lambda
选项,但取决于品味,很好且可读并且来自操作员模块,非常糟糕。如果对象是str.lower
字符串,unicode
将会中断(反之亦然)。