python列表的排序方法_Python3 List sort()方法

1.字符串排序

def list_sort_string():

list=["delphi","Delphi","python","Python","c++","C++","c","C","golang","Golang"]

list.sort() #按字典顺序升序排列

print("升序:",list)

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

print("降序:",list)

排序结果:

升序: ['C', 'C++', 'Delphi', 'Golang', 'Python', 'c', 'c++', 'delphi', 'golang', 'python']

降序: ['python', 'golang', 'delphi', 'c++', 'c', 'Python', 'Golang', 'Delphi', 'C++', 'C']

2.数值型排序

def list_sort_number():

list=[30,40,10,50,50.1,80,60,100,90]

list.sort()

print("升序:",list)

list.sort(reverse=True)

print("降序:",list)

排序结果:

升序: [10, 30, 40, 50, 50.1, 60, 80, 90, 100]

降序: [100, 90, 80, 60, 50.1, 50, 40, 30, 10]

3.根据列表中类对象的属性排序

class element(object):

def __init__(self,id="",name=""):

self.id=id

self.name=name

def __lt__(self, other): # override <操作符

if self.id

return True

return False

def __str__(self): # override __str__

return "id={0},name={1}".format(self.id,self.name)

def sort_by_attribute():

list=[element(id="130",name="json"),

element(id="01",name="jack"),element(id="120",name="tom")]

list.sort()

for item in list:

print(item)

由于 list.sort() 函数在排序时,使用的是小于号对比,所以自定义的数据类型需要 override __lt__(小于) 函数才能实现排序。

根据 element 的 id 属性排序

排序列的结果:

id=01,name=jack

id=120,name=tom

id=130,name=json

4.根据列表中元素的长度排序

def list_sort_by_length():

list=["delphi","Delphi","python","Python","c++","C++","c","C","golang","Golang"]

list.sort(key=lambda ele:len(ele)) #按元素长度顺序升序排列

print("升序:",list)

list.sort(key=lambda ele:len(ele),reverse=True) #按降序排列

print("降序:",list)

借助于 lambda 表达式,计算 list 列表中的元素的长度,根据元素的长度进行排序。

排序的结果:

升序: ['c', 'C', 'c++', 'C++', 'delphi', 'Delphi', 'python', 'Python', 'golang', 'Golang']

降序: ['delphi', 'Delphi', 'python', 'Python', 'golang', 'Golang', 'c++', 'C++', 'c', 'C']

5.根据列表中元素的多个属性进行排序:

def two_d_list_sort():

list=[ ["1","c++","demo"],

["1","c","test"],

["2","java",""],

["8","golang","google"],

["4","python","gil"],

["5","swift","apple"]

]

list.sort(key=lambda ele:ele[0])# 根据第1个元素排序

print(list)

list.sort(key=lambda ele:ele[1]) #先根据第2个元素排序

print(list)

list.sort(key=lambda ele:ele[1]+ele[0]) #先根据第2个元素排序,再根据第1个元素排序

print(list)

同样借助于 lambda 表达式完成,当然也可以定义一个与 labmda 具有相同意义的函数实现排序。

排序结果:

[['1', 'c++', 'demo'], ['1', 'c', 'test'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple'], ['8', 'golang', 'google']]

[['1', 'c', 'test'], ['1', 'c++', 'demo'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]

[['1', 'c++', 'demo'], ['1', 'c', 'test'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]

6.动态的根据用户指定的索引进行排序:

def two_d_list_sort2(sort_index="0,1,2"): # 动态的根据传入的元素索引进行排序

list=[ ["1","c++","demo"],

["1","c","test"],

["2","java",""],

["8","golang","google"],

["4","python","gil"],

["5","swift","apple"]

]

key_set=""

for item in sort_index.split(","):

key_set+="ele["+item+"]+"

key_set=key_set.rstrip("+")

list.sort(key=lambda ele:eval(key_set))

print("排序索引:",sort_index,list)

if __name__=="__main__":

two_d_list_sort2("0")

two_d_list_sort2("1")

two_d_list_sort2("2")

two_d_list_sort2("1,0")

有时候,在写代码之前,并不知道根据二维表的哪几列排序,而是在程序运行的时候根据输入或配置决定的,为了解决这个动态根据多个列或属性排序的问题,借助了eval() 函数,eval() 函数能够把字符串编译成 python 代码并运行,从而达到动态根据多个列或属性排序的目的。

排序结果:

排序索引: 0 [['1', 'c++', 'demo'], ['1', 'c', 'test'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple'], ['8', 'golang', 'google']]

排序索引: 1 [['1', 'c', 'test'], ['1', 'c++', 'demo'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]

排序索引: 2 [['2', 'java', ''], ['5', 'swift', 'apple'], ['1', 'c++', 'demo'], ['4', 'python', 'gil'], ['8', 'golang', 'google'], ['1', 'c', 'test']]

排序索引: 1,0 [['1', 'c++', 'demo'], ['1', 'c', 'test'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]

综上,基本总结了 list.sort 的使用的大部分场景,如下:

1、默认排序

2、根据类对象的单个属性进行排序,当然也可以扩展为根据类对象的多个属性进行排序

3、根据元素的固有属性进行排序,如:长度、第N个元素等。为了简单,所以借助了 lambda 表达式,当然也可以使用普通函数代替 lambda 表达式

4、动态的根据多个列进行排序,同时借助 lambda 和 eval() 函数实现

可能还有一些场景没有涉及到,不过我相信,上面的几种情况可以满足90%以上的场景了,如果在使用中有问题欢迎留言交流。

连少华

连少华

cla***class@163.com3年前 (2018-05-29)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值