文章目录
在python中,列表有两种排序方式,分别是sort和sorted。
- sort是列表的内置方法,可以直接调用,会修改原列表并排好序默认升序,可以通过reverse=True实现降序。cmp函数是比较方法,在python3中已经被废除,key可以指定比较的参数,一维列表一般不需要写key。
list.sort(cmp=None, key=None, reverse=False)
- sorted会新建一个排序好的列表并返回,默认升序,可以通过reverse=True实现降序。同样cmp在python3中已经被废除,key可以指定比较的参数。
sorted(iterable, cmp=None, key=None, reverse=False)
下面介绍如何实现类似于c/c++中的结构体排序。
结构体就是自定义的数据类型,在一个结构体中可以存储任意类型数据。
而列表中可以存储任意类型的数据,可以用一个二维列表充当结构体。
一个参数比较
①写一个getKey方法
def getKey(x):
return int(x[1])
②调用sort函数时,将getKey函数传入
def getKey(x): # 按照下标为1的元素进行排序
return int(x[1])
N=int(input())
list=[]
for i in range(N):
item=input().split() #输入姓名和成绩
list.append(item)
list.sort(key=getKey,reverse=True)
print(list)
下面这个题目就可以使用这种方法来做
第K名
代码:
def getKey(x):
return int(x[1])
N,K=map(int,input().strip().split())
list=[]
for i in range(N):
item=input().split()
list.append(item)
list.sort(key=getKey)
print(list[K-1][0])
多个参数比较
日期排序
代码:
from functools import cmp_to_key
def mycmp(a,b):
if a[2]>b[2]:
return 1
elif a[2]==b[2]:
if a[0]>b[0]:
return 1
elif a[0]==b[0]:
if a[1]>b[1]:
return 1
else:
return -1
else:
return -1
else:
return -1
list=[]
n=int(input())
for i in range(n):
item=input()
a=[]
a.append(int(item[0:2]))
a.append(int(item[3:5]))
a.append(int(item[6:]))
list.append(a)
list.sort(key=cmp_to_key(mycmp))
for item in list:
if item[0]<10:
print(0,end="")
print("{}/".format(item[0]),end="")
if item[1]<10:
print(0,end="")
print("{}/".format(item[1]),end="")
print(item[2])
对于cmp函数的写法,这里举例一个简单的,如果传入的参数a和b,首先比较a[0]和b[0],如果a[0]>b[0],返回1,则表示以第一个元素按升序排序,如果返回-1,则是降序排序,当a[0]==b[0]时,开始比较第二个元素,如果a[1]>b[1],返回-1,则表示第一个元素相等,第二个元素按降序排序。
这个cmp函数表示,按第一个元素的升序和第二个元素的降序进行排序
def mycmp(a,b):
if a[0]>b[0]:
return 1
elif a[0]==b[0]:
if a[1]>b[1]:
return -1
else:
return 1
else:
return -1
调用sort时,将cmp传入即可,注意需要导相应的库
from functools import cmp_to_key
list.sort(key=cmp_to_key(mycmp))
例如:
from functools import cmp_to_key
def mycmp(a,b):
if a[0]>b[0]:
return 1
elif a[0]==b[0]:
if a[1]>b[1]:
return -1
else:
return 1
else:
return -1
list=[[5,0],[5,8],[3,5],[5,2],[0,3],[0,5]]
list.sort(key=cmp_to_key(mycmp))
print(list)
# 输出:[[0, 5], [0, 3], [3, 5], [5, 8], [5, 2], [5, 0]]