python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...
前言
列表推導(dǎo)式構(gòu)建列表的快捷方式,而生成器表達(dá)式則可以用來創(chuàng)建其他任何類型的序列。自python2.7以后,列表推導(dǎo)和生成器表達(dá)式的概念就應(yīng)用到了字典上,所以就有了字典推導(dǎo),以后我們還會遇到集合推導(dǎo)(此處暫不討論)。因此,如果想要更好的學(xué)習(xí)字典推導(dǎo),需要對列表推導(dǎo)和生成器表達(dá)式進(jìn)行充分對掌握。
為什么使用推導(dǎo)式,推導(dǎo)式的應(yīng)用讓代碼的可讀性更強。接下來,我們就一同來驗證為什么說“可讀性更強”。
1.列表推導(dǎo)
示例1:把letter字符串變成Unicode碼位的列表
In [1]: letter='abcdefghr'
In [2]: codes=[]
In [3]: for letter in letter:
...: codes.append(ord(letter))
...:
In [4]: codes
Out[4]: [97, 98, 99, 100, 101, 102, 103, 104, 114]
示例2:把letter字符串變成Unicode碼位的列表的另外一個寫法(即列表推導(dǎo))
In [1]: letter='abcdefghr'
In [2]: codes=[ord(letter) for letter in letter]
In [3]: codes
Out[3]: [97, 98, 99, 100, 101, 102, 103, 104, 114]
如上兩個示例,最終達(dá)到的效果是一致的。但是明顯可以看出,示例2的可讀性更強。大家可能會問,是不是以后就使用列表推導(dǎo)不再使用for循環(huán)來呢?其實不然。通常的原則是,只用列表推導(dǎo)來創(chuàng)建新的列表,并且盡量保持簡短。如果列表推導(dǎo)的代碼超過了兩行,可能就要考慮是不是要用for循環(huán)重寫了。實際上,沒有硬性規(guī)則要求什么時候用什么,或者必須用什么,如何用怎么用,還是需要自己把握。
2.生成器表達(dá)式
與列表推導(dǎo)相比,生成器表達(dá)式是初始化元組、數(shù)組或其他序列類型的更好選擇。原因是生成器表達(dá)式遵守了迭代器協(xié)議,它是逐個的產(chǎn)出元素,而不是構(gòu)造完整列表后,把列表傳遞到函數(shù)里。生成器表達(dá)式與列表推導(dǎo)的語法差不多,不同的是列表推導(dǎo)使用方括號,而生成器表達(dá)式使用的是圓括號。
示例1:使用生成器表達(dá)式初始化元組和數(shù)組
#初始化元組
In [1]: letter='abcdefghr'
In [2]: tuple=tuple(ord(letter) for letter in letter)
In [3]: tuple
Out[3]: (97, 98, 99, 100, 101, 102, 103, 104, 114)
#初始化數(shù)組
In [4]: import array
In [5]: array.array('I',(ord(letter) for letter in letter))
Out[5]: array('I', [97, 98, 99, 100, 101, 102, 103, 104, 114])
如果生成器表達(dá)式是函數(shù)調(diào)用的唯一參數(shù),則不需要再加另外一個圓括號。
array的構(gòu)造方法有兩個參數(shù),第一個參數(shù)確定了數(shù)字的存儲方式。與初始化元組不同,該處有兩個參數(shù),所以生成器表達(dá)式需要用圓括號括起來。
3.字典推導(dǎo)
字典推導(dǎo)可以從任何以鍵值對作為元素的可迭代對象中構(gòu)建出字典。
下面例子就展示了利用字典推導(dǎo)可以把一個裝滿元組的列表編程兩個不同的字典。
創(chuàng)建一個包含成對數(shù)據(jù)的data_name列表,它將直接用在后續(xù)字典的構(gòu)造方法中,具體如下:
In [1]: data_name=[(1561,'祁俊超'),(1560,'鄧亞鑫'),(1559,'黎榮梅'),(1557,'盧雪'),
(1556,'武曉蒙'),(1555,'黃國全'),(1554,'黎榮梅'),(1551,'姚文通'),
(1550,'曾丹丹'),(1548,'武曉蒙')]
In [2]: data_name
Out[2]:
[(1561, '祁俊超'),
(1560, '鄧亞鑫'),
(1559, '黎榮梅'),
(1557, '盧雪'),
(1556, '武曉蒙'),
(1555, '黃國全'),
(1554, '黎榮梅'),
(1551, '姚文通'),
(1550, '曾丹丹'),
(1548, '武曉蒙')]
更改data_name列表中數(shù)據(jù)對的左右位置,姓名為鍵,編號為值。具體如下:
In [3]: name_code={name:code for code,name in data_name}
In [4]: name_code
Out[4]:
{'祁俊超': 1561,
'鄧亞鑫': 1560,
'黎榮梅': 1554,
'盧雪': 1557,
'武曉蒙': 1548,
'黃國全': 1555,
'姚文通': 1551,
'曾丹丹': 1550}
同上面的操作相反,用編號為鍵,姓名為值,并且過濾掉編號大于或等于1560的姓名。具體如下:
In [5]: {code:name for name,code in name_code.items() if code>=1560}
Out[5]: {1561: '祁俊超', 1560: '鄧亞鑫'}
如果對列表推導(dǎo)對概念以及書寫方式已熟知,那么理解字典推導(dǎo)相對容易些。如果對列表推導(dǎo)還不熟知,那么現(xiàn)在應(yīng)該是掌握它導(dǎo)時候了,因為字典推導(dǎo)導(dǎo)表達(dá)形式在其他數(shù)據(jù)類型中慢慢得以體現(xiàn)。同時,使用列表推導(dǎo)和字典推導(dǎo)可以實現(xiàn)對數(shù)據(jù)的過濾效果。
總結(jié)
以上是生活随笔為你收集整理的python推导式多行书写_python三种推导式的详细介绍及其应用示例,强调字典推导的重要性...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql输入命令1002无标题_Lin
- 下一篇: python中forward的作用_基于