python中list的排序

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。于是按照排序值从小到大得到最终结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值