py3k:不区分大小写的列表排序 - 使用或不使用lambda?

时间:2012-10-16 19:31:11

标签: python sorting lambda python-3.x case-insensitive

在:

case-insensitive list sorting, without lowercasing the result?

我见过两种解决方案: (设;假设输入是utf-8字符串的列表,例如['z1', 'A1', 'a0', 'bC']

  • 没有lambda:L.sort(key = str.lower);
  • 使用lambda:L.sort(key = lambda s: s.lower());

有什么区别? 哪个更好或更“pythonic”?

(因为我标记的问题是关于python-3.x。所有与python 2特有的行为相关的评论都是受欢迎的,但请注意)

2 个答案:

答案 0 :(得分:4)

str.lowerstr类型的未绑定方法,lambda s: s.lower()是匿名函数。最终效果是相同的:对于L中的每个元素,调用key callable,传入元素。

如果您没有排序字符串,效果可能会有所不同。 str.lower方法仅适用于字符串,而匿名lambda函数适用于任何具有.lower()方法的函数;例如,如果混合使用bytesstr,请使用此功能。

我更喜欢第一个版本,它更短,更快一点。此外,如果我的值不是字符串,那么它会抛出错误,通常你想要的。

答案 1 :(得分:2)

第三个选项是来自methodcaller模块的operator

from operator import methodcaller
L.sort(key=methodcaller('lower'))

它相当于它所做的lambda选项,但取决于品味,很好且可读并且来自操作员模块,非常糟糕。如果对象是str.lower字符串,unicode将会中断(反之亦然)。