Python 排序(sorted)

转载自:http://blog.csdn.net/hanshileiai/article/details/44241385

要实现的功能

遍历一个list,符合下列条件:

  1. 按照元组第一位的值从小到大排序
  2. 如果第一个相同,则按照元组第2位的值从大到小排序

实现一:

a = [[2,3],[4,1],(2,8),(2,1),(3,4)]
b = sorted(a,key=lambda x: (x[0], -x[1]))
print b

实现二:

a = [[2,{'a':8}],[4,{'a':1}],(2,{'a':8}),(2,{'a':1}),(3,{'a':4})]
array = [7,8]
def fun(x):
    return (-x[0],x[1].get('a'))
b = sorted(a,key=fun)
print b

性能这玩意还是要用数据说话

import time

n = xrange(1000000)
x = zip(n, n)

start = time.time()
x.sort(key = lambda x: (x[0], -x[1]))
end = time.time()
print 'key', end-start

x = zip(n, n)
start = time.time()
x.sort(cmp=lambda x, y: x[0] - y[0] or y[1] - x[1])
end = time.time()
print 'cmp', end-start

输出:

key 2.34500002861 cmp 0.269000053406

key的代码确实优雅些,但不管从直观上,还是实测结果,都看不出来key更快。

如果逆序不能前面加个 ‘-’ 来解决 , 可以用下面的办法
例如: 排序的是个字符串

class Reversinator(object):
    def __init__(self, obj):
        self.obj = obj
    def __lt__(self, other):
        return other.obj < self.obj

a = [(2,'3'),(4,'1'),(2,'8'),(2,'1'),(3,'4')]

print sorted(a, key=lambda x: (x[0], Reversinator(x[1])))

补充:
  Python本身提供了排序功能,其排序算法是稳定的,即key相等的两项在排序后的先后次序不变

list.sort

下面通过list.sort来演示一下如何通过key函数来进行自定义的排序
所谓的key函数,就是以参加排序的每一项作为输入,而输出则为用来排序的key

def my_key1(x): 
    return x % 10 

aList = [4, 5, 1, 2, 12, 34, 56, 9 ,80] 
aList.sort() #默认按升序排列 
print(aList) 

aList.sort(reverse = True) #按降序排列 
print(aList) 

aList.sort(key = my_key1) #根据key函数,按照个位数进行升序排列 
print(aList) 

def my_key2(x): 
    return x[1] 

aList = [(4,'ab'), (56,'c'), (1,'bb'), (102, 'a')] 
aList.sort(key = my_key2) #按照每个元组的第2分量,即字符串排序 
print(aList)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值