Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python py3k:不区分大小写的列表排序-带lambda还是不带lambda?_Python_Sorting_Lambda_Python 3.x_Case Insensitive - Fatal编程技术网

Python py3k:不区分大小写的列表排序-带lambda还是不带lambda?

Python py3k:不区分大小写的列表排序-带lambda还是不带lambda?,python,sorting,lambda,python-3.x,case-insensitive,Python,Sorting,Lambda,Python 3.x,Case Insensitive,在: 我看到了两种解决方案: 允许s假设输入是utf-8字符串列表,例如[z1',A1',a0',bC'] 不带lambda:L.sortkey=str.lower; lambda:L.sortkey=lambda s:s.lower; 有什么区别? 哪一个更好或更像蟒蛇 正如我标记的,问题是关于python-3.x的。欢迎所有与python 2特定行为相关的评论,但请注意str.lower是str类型的未绑定方法,lambda s:s.lower是匿名函数。最终效果是一样的:对于L中的每个元素

在:

我看到了两种解决方案: 允许s假设输入是utf-8字符串列表,例如[z1',A1',a0',bC']

不带lambda:L.sortkey=str.lower; lambda:L.sortkey=lambda s:s.lower; 有什么区别? 哪一个更好或更像蟒蛇

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

str.lower是str类型的未绑定方法,lambda s:s.lower是匿名函数。最终效果是一样的:对于L中的每个元素,调用键callable,并传入元素

如果不对字符串进行排序,效果可能会有所不同。str.lower方法仅适用于字符串,而匿名lambda函数将适用于具有.lower方法的任何对象;例如,当您混合使用字节和str时,请使用此选项

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

第三个选项是来自操作员模块的methodcaller


它的功能相当于lambda选项,但取决于味道,它很好,可读性好,并且来自操作员模块,非常简单。如果对象是unicode字符串,str.lower将断开,反之亦然。

第一个。因为简单总比复杂好,而且它要复杂得多faster@JBernardo-回答这个问题,我会投赞成票。一般来说,除非lambda非常、非常简洁,而且比任何备选方案都简洁,否则它通常是错误的行动方针。Python有一些函数可以作为普通变量传递,所以lambda实际上没有那么有用。这让我想起了关于正则表达式的各种注释。在年,我解释了为什么我认为它们是JavaScript只写的糟糕部分之一,并故意移植了一个集中使用正则表达式的模型,被实现类似效果的编程所取代,但用的是英语,而不是符文和行噪声。公平地说,如果s不是字符串而是一元低位方法,则它具有不同的语义。但是这是不可能的,可能是意外的,如果是意外的话,str.lower版本会更好,因为它会抛出一个错误,而不是静默工作。例外:Python 2中的Unicode字符串。我真的不确定接下来会发生什么。@delnan:是的,这是一个重要的区别。展开。@delnan-你能从你的评论中回答语义上的差异吗,这样我就可以选择它作为解决方案了?@delnan:将unicode字符串传递给str.lower无效,它会抛出一个错误。Python3.x中的字节字符串也是如此。当然,如果有人有一个被lower覆盖的自定义字符串类,那么str.lower可能会给出误导性的结果。另一个类似于lambda s的选项:s.lower是从操作员模块借用并提供key=methodcaller'lower'您确定str.lower将在unicode上中断吗?问题是关于Python3k的,我认为它比py2k更适合utf-8。@GrzegorzWierzowiecki:我确信,在Python2中使用unicode值的str.lower,或者在Python3中使用bytes值的str.lower会抛出类型错误。因此python-3.x可以使用unicode,但不能使用bytes。谢谢你的保证@GrzegorzWierzowiecki你提到UTF-8告诉我你应该读一读。很好的帖子。我将对读者有用。许多编码Unicode utf-8/16/32、big/logendian、带或不带BOM的方法都是我将问题缩小到utf-8的原因。这让我想起了美好的回忆
from operator import methodcaller
L.sort(key=methodcaller('lower'))