共计 1013 个字符,预计需要花费 3 分钟才能阅读完成。
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 函数将根据元组
(而不是字符)来进行比较,进而判断每个字符的前后顺序。
你好,希望你能看到我的评论,我想问一下Sorting1234那个,给元组出来是需求的顺序