2

在:

不区分大小写的列表排序,不小写结果?

我见过两种解决方案:(假设输入是 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 的行为相关的评论,但请注意)

4

2 回答 2

4

str.lowerstr类型的未绑定方法,lambda s: s.lower()是匿名函数。最终效果是一样的:对于 中的每个元素Lkey调用可调用对象,传入元素。

如果您不对字符串进行排序,效果可能会有所不同str.lower方法只适用于字符串,而匿名 lambda 函数适用于任何有.lower()方法的东西;例如,当您混合bytes和时使用它str

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

于 2012-10-16T19:34:09.387 回答
2

第三个选项methodcaller来自operator模块。

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

它相当于lambda它所做的选项,但根据口味,它很好且可读,并且来自操作员模块,相当简洁。str.lower如果对象是unicode字符串(反之亦然),则会中断。

于 2012-10-16T20:01:14.153 回答