在:
我见过两种解决方案:(假设输入是 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 的行为相关的评论,但请注意)
在:
我见过两种解决方案:(假设输入是 utf-8 字符串列表,例如['z1', 'A1', 'a0', 'bC']
)
L.sort(key = str.lower);
L.sort(key = lambda s: s.lower());
有什么区别?哪个更好或更“pythonic”?
(因为我标记的问题是关于python-3.x
。欢迎所有与特定于 python 2 的行为相关的评论,但请注意)
str.lower
是str
类型的未绑定方法,lambda s: s.lower()
是匿名函数。最终效果是一样的:对于 中的每个元素L
,key
调用可调用对象,传入元素。
如果您不对字符串进行排序,效果可能会有所不同。该str.lower
方法只适用于字符串,而匿名 lambda 函数适用于任何有.lower()
方法的东西;例如,当您混合bytes
和时使用它str
。
我更喜欢第一个版本,它更短,速度更快。此外,如果我的值不是字符串,它会抛出一个错误,这通常是你想要的。
第三个选项methodcaller
来自operator
模块。
from operator import methodcaller
L.sort(key=methodcaller('lower'))
它相当于lambda
它所做的选项,但根据口味,它很好且可读,并且来自操作员模块,相当简洁。str.lower
如果对象是unicode
字符串(反之亦然),则会中断。