0
点赞
收藏
分享

微信扫一扫

python结构体排序

若如初梘 2022-01-26 阅读 130

文章目录

在python中,列表有两种排序方式,分别是sortsorted

  • 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]]
举报

相关推荐

0 条评论