您的位置:

Python自定义排序指南

一、Python自定义排序规则

在Python中,我们可以使用sort()函数进行列表排序。sort()函数内部使用一个默认的排序规则,按照数字大小进行排序,按照字典序进行字符串排序,但是有时候我们需要按照自己定义的规则进行排序。可以使用sort()函数的key参数来指定自定义排序规则。

# 按照列表元素的绝对值大小进行排序
l = [3,-5,1,-2,4]
l.sort(key=abs)
print(l)
# 输出结果:[1, -2, 3, 4, -5]

上述代码中,我们定义了一个自定义排序规则,按照列表元素的绝对值大小进行排序。

二、Python自定义类

如果需要按照自己定义的规则进行排序,可以先定义一个类,该类可以实现__lt__()方法,在该方法中定义自己的排序规则。

class Student:
    def __init__(self,name,age,score):
        self.name = name
        self.age = age
        self.score = score
    def __lt__(self,other):
        return self.score < other.score

s1 = Student('Alice',20,90)
s2 = Student('Bob',22,80)
s3 = Student('Charlie',21,95)
students = [s1,s2,s3]
students.sort()
for student in students:
    print(student.name,student.age,student.score)

# 输出结果:
Charlie 21 95
Alice 20 90
Bob 22 80

上述代码中,我们定义了一个名为Student的类,该类拥有姓名、年龄和分数这三个属性。我们实现了__lt__()方法,定义按照分数从小到大的排序规则。最后使用sort()函数对学生列表进行排序。

三、Python自定义排序函数

我们可以直接定义一个排序函数,该函数可以接受一个参数,返回该参数的排序依据,sort()函数的key参数可以传入这个函数进行自定义排序。

def sort_key(st):
    return st[1]

students = [('Alice',20,90),('Bob',22,80),('Charlie',21,95)]
students.sort(key=sort_key)
for student in students:
    print(student[0],student[1],student[2])
    
# 输出结果:
Bob 22 80
Alice 20 90
Charlie 21 95

上述代码中,我们定义了一个名为sort_key的函数,该函数接受一个参数st,返回该元组的第二个元素作为排序依据。最后使用sort()函数对学生列表进行排序。

四、Python list自定义排序

除了可以使用sort()函数之外,Python中还有另外一种排序方式,可以使用sorted()函数对列表进行排序。sorted()函数可以接受三个参数,分别是要排序的列表、排序规则以及reverse参数,该参数默认为False,表示升序排列,如果设置为True,则表示降序排列。

l = [(3,6),(2,1),(1,4),(4,3)]
l_sorted = sorted(l,key=lambda x: x[1],reverse=True)
print(l_sorted)

# 输出结果:
[(3, 6), (1, 4), (4, 3), (2, 1)]

上述代码中,我们使用sorted()函数对列表进行了排序,排序规则是按照元组的第二个元素从大到小排序。

五、排序函数Python

Python中还有其他一些排序函数,比如heapq模块中的heapify()和heappop()函数,可以用于堆排序,内置的sorted()函数也可以用于堆排序。

import heapq

l = [3,-5,1,-2,4]
heapq.heapify(l)  # 构建小根堆
print([heapq.heappop(l) for i in range(len(l))]) # 将堆中元素逐一弹出

# 输出结果:
[-5, -2, 1, 3, 4]

l = [3,-5,1,-2,4]
print(sorted(l))

# 输出结果:
[-5, -2, 1, 3, 4]

上述代码中,我们使用heapq模块中的heapify()函数将一个列表构建成了小根堆,然后使用heappop()函数将堆中元素逐一弹出。在第二个例子中,我们使用Python内置的sorted()函数对列表进行排序。

六、不使用函数用Python排序

除了使用函数之外,我们也可以直接使用Python提供的排序方法进行排序。

l = [(3,6),(2,1),(1,4),(4,3)]
l_sorted = sorted(l,key=lambda x: x[1],reverse=True)
print(l_sorted)

# 输出结果:
[(3, 6), (1, 4), (4, 3), (2, 1)]

上述代码中,我们使用sorted()函数对列表进行了排序,排序规则是按照元组的第二个元素从大到小排序。

七、Python自定义排序规则扑克牌

以扑克牌为例,我们定义了一个Card类,其中花色和点数分别使用字典进行映射。

class Card:
    suits = ['♠', '♥', '♣', '♦']
    faces = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
    def __init__(self,suit,face):
        self.suit = suit
        self.face = face
    def __repr__(self):
        return self.suits[self.suit] + self.faces[self.face]
        
# 创建一副扑克牌
deck = [Card(s,f) for s in range(4) for f in range(13)]
# 输出一副扑克牌
print(deck)

# 对扑克牌按照点数进行排序
deck_sorted = sorted(deck,key=lambda c:c.face)
print(deck_sorted)

# 对扑克牌按照点数、花色进行排序
deck_sorted2 = sorted(deck,key=lambda c:(c.face,c.suit))
print(deck_sorted2)

上述代码中,我们定义了一个Card类,用于描述扑克牌,其中花色和点数分别使用字典进行映射。我们创建了一副扑克牌,并对扑克牌按照点数进行排序,使用的是sorted()函数。最后我们对扑克牌按照点数、花色进行排序,需要在lambda函数中同时传入点数和花色。

八、Python sort自定义排序函数

除了sorted()函数之外,list对象还提供了一个sort()方法可以对列表进行排序,sort()方法和sorted()函数的用法类似。我们可以在sort()方法中传入一个可调用对象来指定排序规则。

cards = [Card(s,f) for s in range(4) for f in range(13)]
def spades_high(card):
    rank_value = Card.faces.index(card.face)
    return rank_value * len(Card.suits) + card.suit

cards.sort(key=spades_high)
print(cards)

上述代码中,我们定义了一个spades_high()函数,该函数接受一个Card对象,并返回一个整数值,用于表示该Card对象的大小。我们调用了sort()方法,并传入了spades_high函数作为排序规则。最后输出的是一副按照点数、花色从小到大排列的扑克牌。

九、结语

在Python中,自定义排序规则是非常方便的。我们可以根据需要定义一个比较函数,也可以通过定义一个类来实现自定义排序规则。无论是使用sort()函数还是sorted()函数,都非常方便。