一、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()
函数,都非常方便。