解析式是將乙個可迭代物件轉換另乙個可迭代物件的工具。在python,容器型別的資料(str,tuple,list,dict,set)都是可迭代物件。
先來看看其語法格式如下所示:
# 列表解析式
[item for item in 可迭代物件 if 條件 ]
# 集合解析式
(item for item in 可迭代物件 if 條件 )
# 字典解析式
從語法格式看起來,就是for迴圈和if的結合體,但卻非常簡潔。至於最終生成的資料型別,可以根據其定義的格式就可以猜出。
先來看看乙個需求,將0~10以內的偶數挑選出來,並輸出其列表結果。實現方法如下所示:
1.方法1:
evenlist=
for item in range(0,11):
if item%2==0:
2.方法2
evenlist=
for item in range(0,11,2):
3.方法3
[item for item in range(0,11) if item%2==0]
以上示例的詳細示意圖如下所示(以不同顏色進行區分):
在前面學過,for迴圈是可以進行巢狀的,那多個for迴圈的是不是也可以使用列表解析式?答案當然是肯定的,下面將演示在給定的路徑下遞迴列出是檔案的檔案,並以列表的形式返回完整的路徑,如下所示:
import os
def getfiles(path):
filelist=[os.path.join(r,f) for r,_,fs in os.walk(path) for f in fs if os.path.isfile(os.path.join(r,f))]
return filelist
另外兩種解析(集合、字典)與列表解析都一樣,只需要注意在定義時的區別即可。
1.字典解析式
# 傳統方式
tempdict={}
for k,v in (("a","b"),("c","d"),("e","f"),("g","h")):
if k not in ("g"):
tempdict[k]=v
# 字典解析式
tempdict=
print(tempdict)
2.集合解析式
# 傳統方式
tempset=set()
for item in (1,1,2,3,4,5,6,7,4,6):
if item >=2:
tempset.add(item)
# 集合解析式
tempset=
3.元組解析式嚴格來講,官方並沒有元組解析式這種說法,如果像列表、字典和集合一樣,最終生成的是乙個生成器物件,如果要想生成的結果為元組的形式,需要使用函式tuple(),如下所示:
>>> tuple(item for item in (1,1,2,3,4,5,6,7,4,6) if item >=2)
(2, 3, 4, 5, 6, 7, 4, 6)
lambda可以做為匿名函式使用,當然也可以與解析結合使用,示例如下所示:
# 將元組拆分為列表
tmplist=(1,2,3,(4,5,6),(7,8),9,((10,20,30),(40,50)))
f=lambda x:[ v for item in x for v in f(item)] if isinstance(x,(tuple,)) else [x]
print(f(tmplist))
輸出結果為:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50]
以上示例是將乙個元組拆分為列表形式,元組資料中裡面還包含有元組,這需要使用遞迴。使用lambda表示式和解析式,一行**就實現,是不是覺得解析很強大?
python基礎 列表解析式簡單應用
總結python基礎之列表解析式簡單應用 列表解析list comprehensions 表示式 expression for iter val in iterable if cond expr expression 最後執行的結果 for iter val in iterable 這個可以是乙個多...
Python基礎12 列表的推導式
本來是和前面的列表內容一塊的 但是加起來 太長,列表推導式就單獨拆分到了這裡來寫 ps 這是我學習過程中一面學一面嘗試的 嘗試內容很多,希望理解 1 列表推導式2 這是個新的東西 3 f 4 我們先定義乙個空列表5 然後我們再寫推導的式子67 for x in range 10 8if x 2 0 ...
python基礎12 語法
字元型別 str 比較大小 從第1個開始比較 數值型別 int 比較大小 整個值比較 strip 刪除首尾 空白 sort 排序 永久 sorted 排序 臨時 reverse 倒序 len 確定長度 lower 轉換為小寫 upper 轉換為大寫 title 首字母大寫 if 條件判斷 and 多...