python-sort函数key解析

7,519次阅读
一条评论

共计 1013 个字符,预计需要花费 3 分钟才能阅读完成。

python-sort函数key解析

sort 之美

后来去看了下 sort 的函数说明,包括 cmp, key, reverse 参数究竟怎么去用,又写了几个例子,以为这下子对 sort 可谓是理解透彻了。比如要要根据值的大小输出字典内容,那么就可以像下面这样优雅地解决:

>>> d = {1: 'z', 2:'y', 3: 'x'}
>>> print sorted(d.items(), key=lambda x: x[1])
[(3, 'x'), (2, 'y'), (1, 'z')]

我甚至可以得到一个根据value排序的字典,只需要用 collections.OrderedDict 即可:

>>> from collections import OrderedDict
>>> sorted_d = OrderedDict(sorted(d.items(), key=lambda x: x[1]))
>>> sorted_d
OrderedDict([(3, 'x'), (2, 'y'), (1, 'z')])

sort 之魅

我以为我对 sort 理解足够了,直到在 hackerrank 遇到这个题目

给定一个只包含大小写字母,数字的字符串,对其进行排序,保证:

  • 所有的小写字母在大写字母前面
  • 所有的字母在数字前面
  • 所有的奇数在偶数前面

考虑用 sort 函数来完成排序。开始之前,再来看看文档对sort函数中key的说明:

key parameter to specify a function to be called on each list element prior to making comparisons. The value of the key parameter should be a function that takes a single argument and returns a key to use for sorting purposes.

通俗讲,key 用来决定在排序算法中 cmp 比较的内容,key 可以是任何可被比较的内容,比如元组(python 中元组是可被比较的)。所以上面的排序问题可以用下面的代码来解决:

>>> s = "Sorting1234"
>>> "".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)))
'ginortS1324'

这里,lambda 函数将输入的字符转换为一个元组,然后 sorted 函数将根据元组(而不是字符)来进行比较,进而判断每个字符的前后顺序。

正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2018-08-01发表,共计1013字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(一条评论)
验证码
rzb 评论达人 LV.1
2019-11-09 15:07:40 回复

你好,希望你能看到我的评论,我想问一下Sorting1234那个,给元组出来是需求的顺序

 Android  UC Browser  中国四川省成都市电信