Python 内置的sorted的函数可以用来对自定义的数据结构(列表)(设该列表为myList)排序,用法如下。
首先上定义。
Python 2下参数列表:sorted(iterable, cmp, key, reverse)
Python 3下参数列表:sorted(iterable, key, reverse)
Python 2 下分两步:
1. 对于自定义的数据结构可以重写一个cmp函数:
def compare(item1, item2):
{某种比较方式,得出表示大或小的布尔值}
return 表示大或小的布尔值
2.调用sorted:
myList = sorted(myList, cmp = compare) # reverse的设置视需要而定
Python 3 下分两步:
1. 对于自定义的数据结构可以重写一个getKeyValue函数:
def getKeyValue(item):
keyValue ={对于MyList的元素item,获得用于比较的键值}
return keyValue
2.调用sorted:
myList = sorted(myList, key = getKeyValue) # reverse的设置视需要而定
小结:
对于像我这种从C/C++过来的程序员,使用sorted时会自然地想到要去重写cmp函数,这在Python 2 环境下是没有问题的。但为了简化和统一,Python 3去掉了sorted()方法中的cmp参数,使得重写cmp函数的办法失效,如果一定要重写cmp,可以用functools.cmp_to_key()来曲线救国,具体可以参考链接:Python3: 找回sort()中消失的cmp参数 - Penguin 。
不过,由于Python 2 的语法中sorted的同样包含了key这个参数,所以Python 3下的方法应当是同样适用于Python 2的。
对于Python 3 中的key这个参数,网上有一些文章解释了这个参数是什么,以及如何用,在此不多赘述,但如果自己写的数据结构比较复杂,建议还是手动写getKeyValue以免出错。key = getKeyValue 把自己写的方法名 ‘getKeyValue’ 传给key,这样就可以用自己的方法来获取用于比较的键值。
举个例子,假设要对某些商品按照其价格进行排序,商品存在myList中——myList是一个list,其中list的每个元素(item)是一个series。元素(item)示例如下:
weight 200.00g
shop XX配件专营店
name USB有线鼠标台式电脑笔记本通用 黑色
price ¥,1.28
这里,价格是像 ‘¥,1.28’ 这样的字符串,那么我们可以写一个getPrice来获取每个item的价格:
def getPrice(item):
return float(item['price'][2:])
然后调用sorted
myList = sorted(myList, key = getPrice)
即可获得正确排序结果。