Python3 對檔案的每行字元按長度排序
一、 清單的sort排序函數
函數原型:
list.sort(key=None,reverse=False)
函數功能:
對原清單進行排序,完成排序後,原清單變為有序清單。預設情況(不傳入任何參數時)按字典順序排序。
函數參數:
(1) key: 主要是用來進行比較的元素,隻有一個參數,具體的函數的參數就是取自于可疊代對象中。指定可疊代對象中的一個元素來進行排序指定排序時使用的單個元素或多個元素、lambda表達式;
(2) reverse:指字排序規則是升序還是降序,預設為升序排序;
二、 排序示例
1. 字元串排序
def list_sort_string():
list=["delphi","Delphi","python","Python","c++","C++","c","C","golang","Golang"]
list.sort() #按字典順序升序排列
print("升序:",list)
list.sort(reverse=True) #按降序排列
print("降序:",list)
排序結果:
升序: ['C', 'C++', 'Delphi', 'Golang', 'Python', 'c', 'c++', 'delphi', 'golang', 'python']
降序: ['python', 'golang', 'delphi', 'c++', 'c', 'Python', 'Golang', 'Delphi', 'C++', 'C']
2. 數值型排序
def list_sort_number():
list=[30,40,10,50,50.1,80,60,100,90]
list.sort()
print("升序:",list)
list.sort(reverse=True)
print("降序:",list)
排序結果:
升序: [10, 30, 40, 50, 50.1, 60, 80, 90, 100]
降序: [100, 90, 80, 60, 50.1, 50, 40, 30, 10]
3. 根據清單中類對象的屬性排序
class element(object):
def __init__(self,id="",name=""):
self.id=id
self.name=name
def __lt__(self, other): # override <操作符
if self.id<other.id:
return True
return False
def __str__(self): # override __str__
return "id={0},name={1}".format(self.id,self.name)
def sort_by_attribute():
list=[element(id="130",name="json"),
element(id="01",name="jack"),element(id="120",name="tom")]
list.sort()
for item in list:
print(item)
由于list.sort()函數在排序時,使用的是小于号對比,是以自定義的資料類型需要override __lt__(小于)函數才能實作排序。
根據element的id屬性排序
排序列的結果:
id=01,name=jack
id=120,name=tom
id=130,name=json
4. 根據清單中元素的長度排序
def list_sort_by_length():
list=["delphi","Delphi","python","Python","c++","C++","c","C","golang","Golang"]
list.sort(key=lambda ele:len(ele)) #按元素長度順序升序排列
print("升序:",list)
list.sort(key=lambda ele:len(ele),reverse=True) #按降序排列
print("降序:",list)
借助于lambda表達式,計算list清單中的元素的長度,根據元素的長度進行排序
排序的結果:
升序: ['c', 'C', 'c++', 'C++', 'delphi', 'Delphi', 'python', 'Python', 'golang', 'Golang']
降序: ['delphi', 'Delphi', 'python', 'Python', 'golang', 'Golang', 'c++', 'C++', 'c', 'C']
5. 根據清單中元素的多個屬性進行排序:
def two_d_list_sort():
list=[ ["1","c++","demo"],
["1","c","test"],
["2","java",""],
["8","golang","google"],
["4","python","gil"],
["5","swift","apple"]
]
list.sort(key=lambda ele:ele[0])# 根據第1個元素排序
print(list)
list.sort(key=lambda ele:ele[1]) #先根據第2個元素排序
print(list)
list.sort(key=lambda ele:(ele[1],ele[0])) #先根據第2個元素排序,再根據第1個元素排序
print(list)
同樣借助于lambda表達式完成,當然也可以定義一個與labmda具有相同意義的函數實作排序。
排序結果:
[['1', 'c++', 'demo'], ['1', 'c', 'test'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple'], ['8', 'golang', 'google']]
[['1', 'c', 'test'], ['1', 'c++', 'demo'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]
[['1', 'c++', 'demo'], ['1', 'c', 'test'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]
6. 動态的根據使用者指定的索引進行排序
有時候,在寫代碼之前,并不知道根據二維表的哪幾列排序,而是在程式運作的時候根據輸入或配置決定的,為了解決這個動态根據多個列或屬性排序的問題,借助了eval()函數,eval函數能夠把字元串編譯成python代碼并運作,進而達到動态根據多個列或屬性排序的目的。
排序結果:
排序索引: 0 [['1', 'c++', 'demo'], ['1', 'c', 'test'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple'], ['8', 'golang', 'google']]
排序索引: 1 [['1', 'c', 'test'], ['1', 'c++', 'demo'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]
排序索引: 2 [['2', 'java', ''], ['5', 'swift', 'apple'], ['1', 'c++', 'demo'], ['4', 'python', 'gil'], ['8', 'golang', 'google'], ['1', 'c', 'test']]
排序索引: 1,0 [['1', 'c++', 'demo'], ['1', 'c', 'test'], ['8', 'golang', 'google'], ['2', 'java', ''], ['4', 'python', 'gil'], ['5', 'swift', 'apple']]
綜上,基本總結了list.sort的使用的大部分場景,如下:
1、預設排序
2、根據類對象的單個屬性進行排序,當然也可以擴充為根據類對象的多個屬性進行排序
3、根據元素的固有屬性進行排序,如:長度、第N個元素等。為了簡單,是以借助了lambda表達式,當然也可以使用普通函數代替lambda表達式
4、動态的根據多個列進行排序,同時借助lambda和eval()函數實作
5、另外相比Python2,Python3取消了sort函數中的 cmp方式,隻能用key方式。
是以python2用cmp方式寫的函數遷移到python3中需要轉換。
from functools import cmp_to_key
sort(iterable, key=cmp_to_key(cmp_fun))
<感謝CSDN:xpresslink的指正>
可能還有一些場景沒有涉及到,不過我相信,上面的幾種情況可以滿足90%以上的場景了;如果在使用中有問題歡迎留言交流。
---------------------
作者:lianshaohua
來源:CSDN
原文:https://blog.csdn.net/lianshaohua/article/details/80483357
版權聲明:本文為部落客原創文章,轉載請附上博文連結!