1. 程式人生 > 實用技巧 >python - 列表解析

python - 列表解析

名詞解釋:

  列表解析 - 根據已有列表,高效建立新列表的方式

優點:

  列表解析,比一般方法的速度,幾乎快一倍

語法:

  [expression for i in data]

舉例:

1. 簡單列表解析

生成0-10的數字列表

n = [i for i in  range(0, 11)]
print(n)   # 列印:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2. 帶條件的列表解析

生成列表:[0, 2, 0, 4, 0, 6, 0, 8, 0, 10](長度為10,奇數為0,偶數不變)

n = [i+1 if i%2 == 1 else 0 for i in  range(0, 10)]   #
if語句在for前面時,必須有else,不然會報錯 print(n) # 列印:[0, 2, 0, 4, 0, 6, 0, 8, 0, 10]
n = [i+1 for i in range(0,10) if i%2 == 1]  # if 在後面時,不能有else,不然會報錯
print(n)   # 列印:[2, 4, 6, 8, 10]

3. 對檔案的操作

列出/tmp/zhangyang中,所有以.log結尾的檔案

普通方法
import
os file1 = [] for i in os.listdir('/tmp/zhangyang'): # os.listdir() 列出某路徑下的所有檔案及資料夾
if i.endswith('.log'): # 篩選出以.log結尾的 file1.append(i) print(file1) # 列印['2.log', '1.log']
列表解析方法
file2 = [i for i in os.listdir('/tmp/zhangyang') if i.endswith('.log')] print(file2) # 列印['2.log', '1.log']

4. 多重迴圈

實現兩個列表中的元素逐一配對

普通方法
list1 = ['a', 'b', 'c'] list2 = [1, 2, 3] my_list
= [] for x in list1: for y in list2: my_list.append((x, y)) print(my_list) # 列印:[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]
列表解析方法
my_list2 = [(x, y) for x in list1 for y in list2] print(my_list2) # 列印:[('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]

矩陣降維

list1 = [('a', 1), ('a', 2), ('a', 3), ('b', 1), ('b', 2), ('b', 3), ('c', 1), ('c', 2), ('c', 3)]

my_list = [y for x in list1 for y in x] # 注意兩個for的先後順序,高維在前
print(my_list)  # 列印:['a', 1, 'a', 2, 'a', 3, 'b', 1, 'b', 2, 'b', 3, 'c', 1, 'c', 2, 'c', 3]

5. 字典解析

把列表轉變為字典

jj = {k: v for k, v in [(1, 201), (2, 201), (3, 205)]}
print(jj)  # 列印:{1: 201, 2: 201, 3: 205}

6. 生成9*9乘法表

print('\n'.join([''.join(['%s*%s=%-2s '%(y,x,x*y)for y in range(1,x+1)])for x in range(1,10)]))

結果如下: