Python sort 自定義函數(shù)排序問題
Python sort 自定義函數(shù)排序
sort() 函數(shù)用于對原列表進(jìn)行排序,如果指定參數(shù),則使用比較函數(shù)指定的比較函數(shù)。
sort() 方法語法:
list.sort( key=None, reverse=False)
參數(shù)
- key – 主要是用來進(jìn)行比較的元素,只有一個參數(shù),具體的函數(shù)的參數(shù)就是取自于可迭代對象中,指定可迭代對象中的一個元素來進(jìn)行排序。
- reverse – 排序規(guī)則,
reverse = True降序,reverse = False升序(默認(rèn))。
以下實例演示了通過指定列表中的元素排序來輸出列表:指定第二個元進(jìn)行素排序
def take_second(elem):
return elem[1]
random = [(2, 2), (3, 4), (5, 6), (1, 5), (6, 3)]
random.sort(key=take_second)
print(random) # [(2, 2), (6, 3), (3, 4), (1, 5), (5, 6)]自定義Python排序函數(shù)比較方式
當(dāng)你想按自己的方式對數(shù)組元素進(jìn)行排序時,我們需要自定義比較函數(shù)實現(xiàn)我們想實現(xiàn)的排序方式。
例1
以降序?qū)?shù)組進(jìn)行排序
>>> def comp(x,y): ... return y-x ... >>> a = [1,8,4,5,2,7] >>> a.sort(comp) >>> a [8, 7, 5, 4, 2, 1]
例2
class Interval(object):
def __init__(self, s=0, e=0):
self.start = s
self.end = e
intervals = []
tmp = [[1,3],[15,18],[8,10],[2,6]]
for l in tmp:
t = Interval(l[0],l[1])
intervals.append(t)
def printInterval(inter):
print("[{}, {}]".format(inter.start,inter.end))
for l in intervals:
printInterval(l)
# [[1,3],[15,18],[8,10],[2,6]]
def comp(it1, it2):
return it1.start-it2.start
intervals.sort(comp)
for l in intervals:
printInterval(l)
# [[1,3],[2,6],[8,10],[15,18]]以上方法皆是python2的實現(xiàn)。python3下實現(xiàn)有所不同(以上方法python3下跑不通),因為python3 sorted取消了對cmp的支持,即python3沒有cmp函數(shù)。
例2的python3實現(xiàn)
class Interval(object):
def __init__(self, s=0, e=0):
self.start = s
self.end = e
intervals = []
tmp = [[1,3],[15,18],[8,10],[2,6]]
for l in tmp:
t = Interval(l[0],l[1])
intervals.append(t)
def printInterval(inter):
print("[{}, {}]".format(inter.start,inter.end))
for l in intervals:
printInterval(l)
def comp(it1):
return it1.start
intervals.sort(key=comp)
# sorted(intervals,key=comp)
for l in intervals:
printInterval(l)在python3中,待比較元素x通過custom_key函數(shù)轉(zhuǎn)化為Python能比較的值custom_key(x),進(jìn)而再基于返回值進(jìn)行排序。
python3 比較第二種方式
如果想和python2中一樣定義比較函數(shù),可以通過functools庫中的cmp_to_key()函數(shù)將比較函數(shù)(comparison function)轉(zhuǎn)化為關(guān)鍵字函數(shù)(key function)。
functools.cmp_to_key(func)函數(shù)將比較函數(shù)轉(zhuǎn)化為關(guān)鍵字函數(shù),與接受key function 的工具一同使用(如 sorted(), min(), max())。
from functools import cmp_to_key as ctk
class Interval(object):
def __init__(self, s=0, e=0):
self.start = s
self.end = e
intervals = []
tmp = [[1,3],[15,18],[8,10],[2,6]]
for l in tmp:
t = Interval(l[0],l[1])
intervals.append(t)
def printInterval(inter):
print("[{}, {}]".format(inter.start,inter.end))
for l in intervals:
printInterval(l)
"""
Please note here.
"""
def comp(it1,it2):
return it1.start-it2.start
intervals.sort(key=ctk(comp))
# sorted(intervals,key=comp)
for l in intervals:
printInterval(l)最后得到的結(jié)果和上面的代碼是一樣的。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置)
這篇文章主要介紹了pyqt5 QScrollArea設(shè)置在自定義側(cè)(任何位置),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
夯實基礎(chǔ)python集合的應(yīng)用場景及字符串定義和表示
這篇文章主要為大家介紹了python集合的應(yīng)用場景及字符串定義和表示,來幫大家夯實基礎(chǔ),有需要的朋友可以借鑒參考下,希望能夠有所幫助2023-10-10
python并發(fā)編程 Process對象的其他屬性方法join方法詳解
這篇文章主要介紹了python并發(fā)編程 Process對象的其他屬性方法join方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-08-08

