列表解析,主要用於動態創建列表 本篇主要說一下,lambda、map()、和filter()同列表解析語句之間結合的用法 列表解析的基本語法為:[expr for iter_var in iterable] 這個語句的核心是for迴圈,他迭代iterable對象的所有條目。前面的expr應用於序列的 ...
列表解析,主要用於動態創建列表
本篇主要說一下,lambda、map()、和filter()同列表解析語句之間結合的用法
列表解析的基本語法為:[expr for iter_var in iterable]
這個語句的核心是for迴圈,他迭代iterable對象的所有條目。前面的expr應用於序列的每個成員,最後的結果值是表達式產生的列表。
1. 基礎使用
來一段示例吧
在idle中進行測試:
>>> [i for i in range(0,8)]
[0,1,2,3,4,5,6,7]
其中 i 即是基本語法中的expr也是iter_val;再換一種方式,我們對裡面的值進行一下運算讓所有的成員乘以2
>>> [i*2 for i in range(0,8)]
[0, 2, 4, 6, 8, 10, 12, 14]
這就是完全按照基本語法寫的一個列表解析
2. 再迴圈語句後面添加判斷條件
擴展版本語法:[expr for iter_val in iterable if cond_expr]
我們還可以進行拓展,在他的後面再添加一些語句,對列表進行篩選;比如我們只要這個數值中可以被2整除的數
>>> [i for i in range(1,8) if i%2 == 0]
[ 2, 4, 6]
這種語句類似於使用filter,所以我們同樣可以採用python內置的filter函數實現,以達到獲取相同的值
>>> l = filter(lambda x:x%2==0, range(1,8))
>>> for i in l:
i
2
4
6
但是發現沒有,有一些不一樣,因為我並沒有直接列印出列表。為什麼呢?因為filter的返回值是一個生成器(generator),生成器是
無法知道所有的值的,只能通過迭代的方式獲取下一個值
3. map用於達到跟列表解析相同的結果
>>> map(lambda x: x*2, range(1,8))
[2, 4, 6, 8, 10, 12, 14]
使用它可以獲得 [x * 2 for x in range(1,8)]一樣的效果,但是使用後者回比map()更高效
4. 生成矩陣
當你需要得到一個3行5列的矩陣的時候,很簡單:
>>> [(x,y) for x in range(0,3) for y in range(0,5)]
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4),
(1, 0), (1, 1), (1, 2), (1, 3), (1, 4),
(2, 0), (2, 1), (2, 2), (2, 3), (2, 4)]
大家也可以在PEP 202找到更多的參考列表解析的資料