推導(dǎo)式comprehensions(又稱解析式)椭迎,是Python的一種獨(dú)有特性锐帜。推導(dǎo)式是可以從一個(gè)數(shù)據(jù)序列構(gòu)建另一個(gè)新的數(shù)據(jù)序列的結(jié)構(gòu)體。 共有三種推導(dǎo)畜号,在Python2和3中都有支持:
列表(list)推導(dǎo)式
字典(dict)推導(dǎo)式
集合(set)推導(dǎo)式
?
一抹估、列表推導(dǎo)式
?
1、使用[]生成list
?
基本格式
?[表達(dá)式 for 變量 in 列表] ? ?或者 ?[表達(dá)式 for 變量 in 列表 if 條件]
?
例1: ?過(guò)濾掉長(zhǎng)度小于3的字符串列表弄兜,并將剩下的轉(zhuǎn)換成大寫(xiě)字母
>>> names = ['Bob','Tom','alice','Jerry','Wendy','Smith'] ? ?
?
>>>?[name.upper() for name in names if len(name)>3]??
?
['ALICE', 'JERRY', 'WENDY', 'SMITH']?
生成間隔5分鐘的時(shí)間列表序列:
["%02d:%02d" %(h,m) for h in range(0, 24) for m in range(0, 60, 5)]
例2: ?求(x,y)其中x是0-5之間的偶數(shù),y是0-5之間的奇數(shù)組成的元祖列表
>>>?[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]??
?
[(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)]
例3: ?求M中3,6,9組成的列表
>>> M = [[1,2,3],[4,5,6],[7,8,9]]
>>> M ?
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] ?
?
>>>?[row[2] for row in M]???
?
[3, 6, 9]?
?
#或者用下面的方式 ?
?
>>>?[M[row][2] for row in (0,1,2)]??
[3, 6, 9] ?
例4: ?求M中斜線1,5,9組成的列表
>>> M ?
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] ?
?
>>>?[ M[i][i] ?for i in range(len(M))] ? 即打印?M[0][0],M[1][1],M[2][2]
?
[1, 5, 9] ?
例5: ?求M,N中矩陣和元素的乘積
>>> M = [[1,2,3],[4,5,6],[7,8,9]] ?
>>> N = [[2,2,2],[3,3,3],?[4,4,4]] ?
?
>>>?[M[row][col]*N[row][col] for row in range(3) for col in range(3)]??
?
[2, 4, 6, 12, 15, 18, 28, 32, 36] ?
?
>>>?[[M[row][col]*N[row][col] for col in range(3)] for row in range(3)]??
?
[[2, 4, 6], [12, 15, 18], [28, 32, 36]] ?
?
>>>?[[M[row][col]*N[row][col] for row in range(3)] for col in range(3)]??
?
[[2, 12, 28], [4, 15, 32], [6, 18, 36]] ?
例5: ?講字典中age鍵瓷式,按照條件賦新值
>>> bob ?
{'pay': 3000, 'job': 'dev', 'age': 42, 'name': 'Bob Smith'} ?
?
>>> sue ?
{'pay': 4000, 'job': 'hdw', 'age': 45, 'name': 'Sue Jones'} ?
?
>>> people = [bob, sue] ?
?
>>>?[rec['age']+100 if rec['age'] >= 45 else rec['age'] for rec in people]??# 注意for位置 ?
?
[42, 145] ?
列表推導(dǎo)式總共有兩種形式:
①[x for x in data if condition]
? ? 此處if主要起條件判斷作用替饿,data數(shù)據(jù)中只有滿足if條件的才會(huì)被留下,最后統(tǒng)一生成為一個(gè)數(shù)據(jù)列表
?
②[exp1 if condition else exp2 for x in data]
? ? 此處if...else主要起賦值作用贸典,當(dāng)data中的數(shù)據(jù)滿足if條件時(shí)將其做exp1處理视卢,否則按照exp2處理,最后統(tǒng)一生成為一個(gè)數(shù)據(jù)列表
例子如下:
data = ['driver', '2017-07-13', 1827.0, 2058.0, 978.0, 1636.0, 1863.0, 2537.0, 1061.0]
(1)若我要取得以上列表中值大于2000的數(shù)值廊驼,這里可以使用列表推導(dǎo)式的形式①:
[x for x in data if x > 2000]
得到如下結(jié)果(字符串類型數(shù)據(jù)被認(rèn)為是無(wú)窮大數(shù)):
?['driver', '2017-07-13', 2058.0, 2537.0]
(2)若要解決我上面提到的問(wèn)題据过,則需要使用列表推導(dǎo)式的形式②
[int(x) if type(x) == float else x for x in data]
得到結(jié)果:
?['driver', '2017-07-13', 1827, 2058, 978, 1636, 1863, 2537, 1061]
1、使用[]生成list
基本格式
variable = [out_exp_res for out_exp in input_list if out_exp == 2]
? out_exp_res: 列表生成元素表達(dá)式妒挎,可以是有返回值的函數(shù)绳锅。
? for out_exp in input_list: 迭代input_list將out_exp傳入out_exp_res表達(dá)式中。
? if out_exp == 2: 根據(jù)條件過(guò)濾哪些值可以酝掩。
例一:
multiples = [i for i in range(30) if i % 3 is 0]
?
print(multiples)
?
# Output: [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
例二:
def squared(x):
? ? return x*x
?
multiples = [squared(i) for i in range(30) if i % 3 is 0]
?
print multiples
?
# ?Output: [0, 9, 36, 81, 144, 225, 324, 441, 576, 729]
2鳞芙、使用()生成generator
將倆表推導(dǎo)式的[]改成()即可得到生成器。
multiples = (i for i in range(30) if i % 3 is 0)
?
print(type(multiples))
?
# ?Output: <type 'generator'>
二期虾、字典推導(dǎo)式
?
字典推導(dǎo)和列表推導(dǎo)的使用方法是類似的原朝,只不中括號(hào)該改成大括號(hào)。
{ key_expr: value_expr for value in collection if condition }
直接舉例說(shuō)明:
l = ["%02d:%02d" %(h,m) for h in range(0, 24) for m in range(0, 60, 5)]
?
d = {key:0 for key in s}
?
print(d)
?
print(sorted(d.key()))
例1: ?用字典推導(dǎo)式以字符串以及其長(zhǎng)度建字典
>>> strings = ['import','is','with','if','file','exception'] ?
>>>?D = {key: val for val,key in enumerate(strings)} ?
>>> D ?
{'exception': 5, 'is': 1, 'file': 4, 'import': 0, 'with': 2, 'if': 3} ?
例子一:大小寫(xiě)key合并
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
?
mcase_frequency = {
? ? k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
? ? for k in mcase.keys()
? ? if k.lower() in ['a','b']
}
?
print mcase_frequency
?
# ?Output: {'a': 17, 'b': 34}
例子二:快速更換key和value
mcase = {'a': 10, 'b': 34}
?
mcase_frequency = {v: k for k, v in mcase.items()}
?
print mcase_frequency
?
# ?Output: {10: 'a', 34: 'b'}
三镶苞、集合推導(dǎo)式
它們跟列表推導(dǎo)式也是類似的喳坠。 唯一的區(qū)別在于它使用大括號(hào){}。
{ expr for value in collection if condition }
例一:
squared = {x**2 for x in [1, 1, 2]}
?
print(squared)
?
# Output: set([1, 4])
例1: ?用集合推導(dǎo)建字符串長(zhǎng)度的集合
>>> strings = ['a','is','with','if','file','exception'] ?
?
>>>?{len(s) for s in strings} ? ?#有長(zhǎng)度相同的會(huì)只留一個(gè)茂蚓,這在實(shí)際上也非常有用?
??
set([1, 2, 4, 9]) ?
嵌套列表是指列表中嵌套列表壕鹉,比如說(shuō):
>>> L = [[1,2,3],[4,5,6],[7,8,9]] ?
例1: 一個(gè)由男人列表和女人列表組成的嵌套列表,取出姓名中帶有兩個(gè)以上字母e的姓名,組成列表
names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe']聋涨,['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']] ?
用for循環(huán)實(shí)現(xiàn):
tmp = [] ?
for lst in names: ?
? ? for name in lst: ?
? ? ? ? if name.count('e') >= 2: ?
? ? ? ? ? ? tmp.append(name) ?
print tmp ?
#輸出結(jié)果 ?
>>> ??
['Jefferson', 'Wesley', 'Steven', 'Jennifer'] ?
用嵌套列表實(shí)現(xiàn):
>>> [name for lst in names for name in lst if name.count('e')>=2] ?#注意遍歷順序御板,這是實(shí)現(xiàn)的關(guān)鍵 ?
['Jefferson', 'Wesley', 'Steven', 'Jennifer'] ?