例如list之類有序的容器可以用sort這個方法來做排序,但若是其中的物件沒辨法比較時(沒有實作< operator)會產生Error,這時用用key傳入一個function回傳可比較的物件來代替。
class Tool:
def __init__(self, name, weight):
self.name = name
self.weight = weight
def __repr__(self):
return f'Tool({self.name!r}, {self.weight})'
tools = [
Tool('level', 3.5),
Tool('hammer', 1.25),
Tool('screwdriver', 0.5),
]
tools.sort()
TypeError: ‘<‘ not supported between instances of ‘Tool’ and ‘Tool’
我們可以用一個lamda function來讓Tool物件以name元素來做排序。
tools.sort(key=lamda x: x.name)
print(tools)
[Tool(‘hammer’, 1.25), Tool(‘level’, 3.5), Tool(‘screwdriver’, 0.5)]
或是回傳一個tuple,sort會依照順序來做比較。
tools = [
Tool('sander', 4),
Tool('drill', 4),
Tool('circular saw', 0.5),
]
tools.sort(key=lambda x: (x.weight, x.name))
print(tools)
Tool(‘circular saw’, 0.5), Tool(‘drill’, 4), Tool(‘sander’, 4)]
另外可以用reverse參數或是負號來做反向排序
tools.sort(key=lambda x: (x.weight, x.name), reverse=True)
print(tools)
[Tool(‘sander’, 4), Tool(‘drill’, 4), Tool(‘circular saw’, 0.5)]
tools.sort(key=lambda x: (-x.weight, x.name), reverse=True)
print(tools)
[Tool(‘circular saw’, 0.5), Tool(‘sander’, 4), Tool(‘drill’, 4)]