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