python的各種推導(dǎo)式(列表推導(dǎo)式、字典推導(dǎo)式蹂安、集合推導(dǎo)式)

推導(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'] ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市牛郑,隨后出現(xiàn)的幾起案子怠肋,更是在濱河造成了極大的恐慌,老刑警劉巖淹朋,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笙各,死亡現(xiàn)場(chǎng)離奇詭異钉答,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)杈抢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)数尿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惶楼,你說(shuō)我怎么就攤上這事右蹦。” “怎么了歼捐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵何陆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我豹储,道長(zhǎng)贷盲,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任剥扣,我火速辦了婚禮巩剖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钠怯。我一直安慰自己佳魔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布晦炊。 她就那樣靜靜地躺著吃引,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刽锤。 梳的紋絲不亂的頭發(fā)上镊尺,一...
    開(kāi)封第一講書(shū)人閱讀 52,337評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音并思,去河邊找鬼庐氮。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宋彼,可吹牛的內(nèi)容都是我干的弄砍。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼输涕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼音婶!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起莱坎,我...
    開(kāi)封第一講書(shū)人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衣式,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體碴卧,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡弱卡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了住册。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婶博。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荧飞,靈堂內(nèi)的尸體忽然破棺而出凡人,到底是詐尸還是另有隱情,我是刑警寧澤叹阔,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布挠轴,位于F島的核電站,受9級(jí)特大地震影響条获,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒋歌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一帅掘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧堂油,春花似錦修档、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至迫靖,卻和暖如春院峡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背系宜。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工照激, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人盹牧。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓俩垃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親汰寓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子口柳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容