python 多维list 排序_一行代码的优雅| Python列表生成式
歡迎回來,上一周我們整理了基礎課中三大結構有關內容的具體應用及案例。可以通過以下幾篇推文進行回溯:
Python語言基礎50課
我的Python?-?100天筆記?|D1-D7
我的Python?-?100天筆記?|D8-D14
列表是Python中非常常見的數據結構,在基礎課中也占了不小的篇幅。今天的推送就列表相關的內容再整理。
列表是包含有索引的元素集,其中的元素可由字符、數字、字符串及子列表組成,用 list = []表示。基本操作包括:
增加元素list.append(obj)?在列表末尾添加新的元素?list.insert(index,obj)?能夠在列表任意位置添加新的元素。
刪除元素list.pop(index)?移除索引位置的元素,同時會返還被移除元素的值。del list[index]?移除移除索引位置的元素,但不返回移除元素的值,注意中間是空格。list.remove(obj)?移除第一個匹配到的元素。
修改元素list[index] = obj
查找元素list.index('obj')
列表排序sort(list)?永久性排序。temp_list = sorted(list)?返回一個新建的已排序列表。list.sort(reverse=Ture)?反向排序。
列表切片
list[start:end:step]?切片是支持步長選擇的。
嵌套列表的使用
嵌套的列表可以用來表示表格或數學上的矩陣,可以用于記錄多維的數據,但是需要注意的是,嵌套列表不能夠使用以下的方式生成:
scores = [[0] * 3] * 5print(scores) # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]# 嵌套的列表需要多次索引操作才能獲取元素正確的方式如下(生成式):
scores = [[0] * 3 for _ in range(5)]scores[0][0] = 95print(scores) # [[95, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]示例圖如下:
第011課:常用數據結構之列表
列表生成式
[exp?for?iter_var?in?iterable]生成式中,首先會將可迭代對象iterable中的每個元素的結果賦值給iter_var,然后通過exp得到一個新的計算值;最后把所有通過exp得到的計算值以一個新列表的形式返回。也就是與下列語句同效:
L?=?[]for?iter_var?in?iterable:
????L.append(exp)
類似的,還有以下兩種可使用的方式:
#帶過濾功能語法格式[exp?for?iter_var?in?iterable?if_exp]
#循環嵌套語法格式
[exp?for?iter_var_A?in?iterable_A?for?iter_var_B?in?iterable_B]
也就是在之前的基礎上,添加判斷條件或嵌套循環。
例如,過濾出一個指定的數字列表中值大于20的元素
L?=?[3,?7,?11,?14,22,?33,?26,?57,?99]#?不使用列表生成式實現
list_new?=?[]
for?x?in?L:
????if?x?20:
????????list_new.append(x)
#?使用列表生成式實現
list_newi?=?[x?for?x?in?L?if?x?>?20]
再來一個例子:把一個列表中所有的字符串轉換成小寫,非字符串元素移除
L?=?['TOM',?'Peter',?10,?'Jerry']#?用列表生成式實現
list1?=?[x.lower()?for?x?in?L?if?isinstance(x,?str)]
#?用map()和filter()函數實現
list2?=?list(map(lambda?x:?x.lower(),?filter(lambda?x:?isinstance(x,?str),?L)))
我們在之前推送中聊過這類 map()和filter() 高階函數的簡單用法,高階函數的英文為 Higher-order function ,怎么理解呢。我們從內置函數再來理解一下上面的提及到的函數名定義規則與變量一致,換句話說函數名也可以認為是一個變量。
那么,既然變量可以指向函數,函數的參數能接收變量,那么一個函數就可以接收另一個函數作為參數,這種函數就稱之為高階函數。
高階函數,我們以?map(f,list) #對列表內元素逐個處理,舉個栗子:
#?對每一個元素進行平方計算def?f(x):
????return?x*x
for?i?in?map(f,[1,2,3,4,5,6,7]):
????print(i)
#?使用正則取列表中所有元素的關鍵字,省略部分代碼
import?re
def?id(x):
????return?re.findall(r'ORF\d+_(.*?):',x)[0]
for?line?in?f:
????if?line.startswith('P'):
????????line?=?line.split('\t')
????????line1?=list(map(id,line))
????????print(line1)
比較來看,對于大部分需求來講,使用列表生成式和使用高階函數都能實現。這對于那些元素數量很大或無限的可迭代對象來說顯然是更合適的,因為可以避免不必要的內存空間浪費。
enumerate函數
遍歷列表時,課程中有一個函數值得關注 enumerate,該函數在循環遍歷時會取到一個二元組,解包之后第一個值是索引,第二個值是元素,下面是一個簡單的對比。
items?=?['Python',?'Java',?'Go',?'Swift']for?index?in?range(len(items)):
????print(f'{index}:?{items[index]}')
for?index,?item?in?enumerate(items):
????print(f'{index}:?{item}')
第013課:列表和元組的應用
終于梳理了生成式的一些用法,同時從比較中引申出不同方法實現相同目的的用法,希望對你有啟發~
參考資料
? jackfrued/ Python-Core-50-Courses
? https://www.cnblogs.com/yyds/p/6281453.html
往期推薦
ComplexHeatmap包更新支持pheatmap轉換
??4種繪制帶誤差線的柱形圖
生信技能樹目前已經公開了三個生信知識庫,記得來關注哦~
每周文獻分享
https://www.yuque.com/biotrainee/weeklypaper
腫瘤外顯子分析指南
https://www.yuque.com/biotrainee/wes
生物統計從理論到實踐
https://www.yuque.com/biotrainee/biostat
友情宣傳
強烈建議你推薦給身邊的博士后以及年輕生物學PI,多一點數據認知,讓他們的科研上一個臺階:
?生信爆款入門-全球聽(買一得五)(第4期) ,你的生物信息學入門課。?數據挖掘第2期(兩天變三周,實力加量),醫學生/醫生首選技能提高課。?生信技能樹的2019年終總結?,你的生物信息學成長寶藏?2020學習主旋律,B站74小時免費教學視頻為你領路
總結
以上是生活随笔為你收集整理的python 多维list 排序_一行代码的优雅| Python列表生成式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (最小生成树)prim算法
- 下一篇: php数字从大到小生成,php输入几个数