list可以通过list的内置函数list.sort()或序列类型函数sorted(list)来进行排序。
两者的区别是:
- list.sort()不会返回对象,改变原有的list顺序。
- sorted(list)返回一个对象,可以用作表达式,原生的list顺序不变,生成一个新的排好序的list对象。
排序规则如果不写的话,就使用默认规则。否则就自定义排序规则。
排序规则可以通过cmp和key参数来指定:
- cmp是自定义比较函数,可以定义排序规则。
- key 是一个函数,它接受一个参数并返回一个用于排序的键。这种技巧速度很快,因为对于每个输入记录只会调用一次 key 函数。
在python3.x中,cmp 参数被完全删除(作为简化和统一语言努力的一部分,消除了丰富的比较与 cmp() 魔术方法之间的冲突)
通过cmp参数排序:
def compare(sf1, sf2):
if sf1['value'] < sf2['value']:
return -1
elif sf1['value'] == sf2['value']:
return 0
else:
return 1
listA = [
{'value': 1, 'status': 1},
{'value': 0, 'status': 2},
{'value': 3, 'status': 0},
]
listA.sort(compare)
print listA
结果是:
[{'status': 2, 'value': 0}, {'status': 1, 'value': 1}, {'status': 0, 'value': 3}]
其实这个跟java里面的排序写法差不多。
通过key参数排序:
listA = [
{'value': 1, 'status': 1},
{'value': 0, 'status': 2},
{'value': 3, 'status': 0},
]
listA.sort(key=lambda x: x['value']) # x为list的元素,x['value']为用于排序的键。
print listA
再看一个实际例子
data = [
{'sid': 231L, 'updated': '2013-07-11', 'price': 1.0, 'vip_status': 0},
{'sid': 41544L, 'updated': '2013-09-24', 'price': 40.0, 'vip_status': 0},
{'sid': 43644L, 'updated': '2014-03-11', 'price': 10.0, 'vip_status': 0},
{'sid': 49293L, 'updated': '2014-06-16', 'price': 12.0, 'vip_status': 0}
]
rule = {49293: 0, 231: 1, 41544: 2, 43644: 3}
#data = sorted(data, key=lambda x: rule[x['sid']] if "sid" in x else 0)
data.sort(key=lambda x: rule[x['sid']] if "sid" in x else 0)
print data
最终得到结果如下:
[{'vip_status': 0, 'updated': '2014-06-16', 'price': 12.0, 'sid': 49293L},
{'vip_status': 0, 'updated': '2013-07-11', 'price': 1.0, 'sid': 231L},
{'vip_status': 0, 'updated': '2013-09-24', 'price': 40.0, 'sid': 41544L},
{'vip_status': 0, 'updated': '2014-03-11', 'price': 10.0, 'sid': 43644L}]
请注意,这里巧妙地多用了一层映射,如果直接简单的将x[‘sid’]作为排序的键,那自然是按照x[‘sid’]从小到大排序。而为了按照指定的规则排,可以将x[‘sid’]作为另一个字典的键,映射成另一个值,这样排序的键就变成了0,1,2,3。第一个 元素进来,其排序值为1,第二个元素其排序值为2,第三个排序值为3,第四个排序值为0。于是按照排序值从小到大得到最终结果。