1. 程式人生 > 其它 >python筆記--列表、集合和字典推導式

python筆記--列表、集合和字典推導式

技術標籤:python學習筆記

列表、集合和字典推導式

列表推導式是Python最受喜愛的特性之⼀。它允許⽤戶⽅便的從⼀個集合過濾元素,形成列表,在傳遞引數的過程中還可以修改元素。形式如下:

[expr for val in collection if condition]

它等同於下⾯的for迴圈:

result = []
for val in collection:
if condition:
result.append(expr)

例如,給定⼀個字串列表,我們可以過濾出⻓度在2及以
下的字串,並將其轉換成⼤寫:

In [154]: strings = ['a', 'as', 'bat'
, 'car', 'dove', 'python'] In [155]: [x.upper() for x in strings if len(x) > 2] Out[155]: ['BAT', 'CAR', 'DOVE', 'PYTHON']

⽤相似的⽅法,還可以推導集合和字典。字典的推導式如下所示:

dict_comp = {key-expr : value-expr for value in collection if condition}

集合的推導式與列表很像,只不過⽤的是尖括號:

set_comp = {expr for value in collection if condition}

作為⼀個字典推導式的例⼦,我們可以建立⼀個字串的查詢對映表以確定它在列表中的位置:

In [159]: loc_mapping = {val : index for index, val in enumerate(strings)}
In [160]: loc_mapping
Out[160]: {'a': 0, 'as': 1, 'bat': 2, 'car': 3, 'dove': 4, 'python': 5}

巢狀列表推導式

假設我們有⼀個包含列表的列表,包含了⼀些英⽂名和⻄班⽛名:

In [161]: all_data = [['John', 'Emily', 'Michael', 'Mary'
, 'Steven'], .....: ['Maria', 'Juan', 'Javier', 'Natalia', 'Pilar']]

你可能是從⼀些⽂件得到的這些名字,然後想按照語⾔進⾏分類。現在假設我們想⽤⼀個列表包含所有的名字,這些名字中包含兩個或更多的e。可以⽤for迴圈來做:

names_of_interest = []
for names in all_data:
enough_es = [name for name in names if name.count('e') >= 2]
names_of_interest.extend(enough_es)

可以⽤巢狀列表推導式的⽅法,將這些寫在⼀起,如下所示:

In [162]: result = [name for names in all_data for name in names
.....: if name.count('e') >= 2]
In [163]: result
Out[163]: ['Steven']