python内置函数之sorted

sorted是用来给可遍历的对象进行排序的

[TOC]
api说明:

def sorted(*args, **kwargs): # real signature unknown
#  Return a new list containing all items from the iterable in ascending order.

  #  A custom key function can be supplied to customize the sort order, and the
    #reverse flag can be set to request the result in descending order.

说明:

返回值是一个list
需要一个关于key的函数(这个是用来产生一个类似权重值的东西,表示该元素在列表中的优先性)
reverse标志得到True(逆序) 或者False(顺序)来设置返回的list是正序还是倒序,不指定,默认效果是正序
简单实例:
以下示例根据字符串的长度来排序返回list

#此函数用来返回排序依据得到重要性数值,通过返回值的大小来确定
def getStrLength(data):
    return len(data)
listStr=["1","22","4444","444","2","3","333"]
print(sorted(listStr,key=getStrLength,reverse=True))

排序结果:

[‘4444’, ‘444’, ‘333’, ‘22’, ‘1’, ‘2’, ‘3’]

如果不设置reverse标签,结果为:

[‘1’, ‘2’, ‘3’, ‘22’, ‘444’, ‘333’, ‘4444’]

需要注意的是:定义key函数时是有参数data的,但是使用时却是没有括号和参数
当然也可以不用单独定义一个key函数,可以使用lambada表达式,来实现,
实现如下:

listStr=["1","22","4444","444","2","3","333"]
print(sorted(listStr,key=lambda data:len(data)))

:lambada是匿名函数,没有函数名格式是 lambada arg: doSomething
lambada+ 参数(多个参数之间使用“,” 分隔)+”:”+一些处理
使用场景:
- 1 函数只在某一处使用,不需要被复用,比如某些执行脚本;
- 2 使用lambada让代码更简洁
lambada参考见此

言归正传,再次返回到sorted,sorted比较强大,强大之处key函数类似于java中的comparable接口,来比较对象,进而实现对对象的排序,而不仅仅局限于数字排序
再看一个示例:

给扑克牌排序


输入字符传列表:array=[“黑桃3”,”黑桃4”,”方块Q”,”方块J”,”方块6”,”方块5”,”黑桃9”,”方块A”]
1,按照点数排序
2,按照花色排序
3,按照花色和点数排序(多个排序依据)
花色有:方块,梅花,红桃,黑桃
1,2基本是和上一个例子一样了
3,多个排序依据,方块<黑桃<红桃<梅花
数字:A<2<3< ……


def compareKey(s):
    key=0
    head=s[0:2]
    if head=="方块":
        key+=100
    elif head=="黑桃":
        key+=200
    elif head=="红桃":
        key+=300
    else:
        key+=400
#     转换字母数字
    number=s[2:]
    if str(number).upper()=="A":
        key+=1
    elif str(number).upper()=="J":
        key+=10
    elif str(number).upper()=="Q":
        key+=11
    elif str(number).upper()=="K":
        key+=12
    else:
        key+=ord(number)-ord('1')
    return key




array=["黑桃3","黑桃4","方块Q","方块J","方块6","方块5","黑桃9","方块A"]
print(sorted(array,key=compareKey))

效果:
[‘方块A’, ‘方块5’, ‘方块6’, ‘方块J’, ‘方块Q’, ‘黑桃3’, ‘黑桃4’, ‘黑桃9’]

另一种实现方式,通过字典

def getHeadKey(data):
    head=data[0:2]
    pk={'方块':4,'梅花':3,'红桃':2,'黑桃':1}
    return pk[head]
def getNumberKey(data):
    number=data[2:]
    sk={'A':14,'K':13,'Q':12,'J':11,'10':10, '9':9, '8':8,'7':7,'6':6,'5':5,'4':4,'3':3,'2':2,'1':1}
    return sk[number]
def getComplexKey(data):
    return getHeadKey(data)+getNumberKey(data)

inputStr="方块A,方块K,梅花3,方块10,方块J,梅花10,梅花7"
print("花色排序:",sorted(inputStr.split(','),key=getHeadKey))
print("点数排序:",sorted(inputStr.split(','),key=getNumberKey))
print("组合排序:",sorted(inputStr.split(','),key=getComplexKey))

猜你喜欢

转载自blog.csdn.net/qq_36922927/article/details/80812906