摘要:找出列表中小于的數(shù)據(jù)除了列表推導(dǎo)式,還有字典推導(dǎo)式,集合推導(dǎo)式,用法都一樣。如果你的數(shù)據(jù)量很大的話,考慮使用生成器表達(dá)式。切片不僅對(duì)列表有用,同樣適用于元組和字符串。切片命名使用方法,內(nèi)部參數(shù)與切片一樣。對(duì)剩余的的數(shù)據(jù),使用星號(hào)代替即可。
上次我們講了幾個(gè)不常見(jiàn)的數(shù)據(jù)類型,每個(gè)都有自己特殊的用途,雖然不經(jīng)常用到,了解一下也好。比如我們提到的數(shù)組類型,如果在數(shù)據(jù)量很大的時(shí)候同時(shí)要效率,就可以使用它。這次來(lái)說(shuō)說(shuō)python中常見(jiàn)的數(shù)據(jù)類型像列表、元組、字典、集合中的一些很有用的技巧,幫助你提高開(kāi)發(fā)效率。
來(lái)看看。
列表有一個(gè)很有用的技巧是使用列表推導(dǎo)式,這個(gè)大家可能都知道,如果你需要迭代列表中的數(shù)據(jù),使用循環(huán)是個(gè)很麻煩的事,使用列表推導(dǎo)式一行就搞定。
datas = [3, 4, 2, 8, 12, 5, 7] # 找出列表中小于10的數(shù)據(jù) print([data for data in datas if data<10])
[3, 4, 2, 8, 5, 7]
除了列表推導(dǎo)式,還有字典推導(dǎo)式,集合推導(dǎo)式,用法都一樣。還有一個(gè)特殊的生成器表達(dá)式,生成器表達(dá)式并不會(huì)在剛開(kāi)始就生成一個(gè)數(shù)據(jù)類型,而是在迭代時(shí)才生成,這樣可以節(jié)省內(nèi)存。如果你的數(shù)據(jù)量很大的話,考慮使用生成器表達(dá)式。生成器表達(dá)式使用小括號(hào)。
# 使用上面的數(shù)據(jù) # 生成器表達(dá)式使用小括號(hào) r = (data for data in datas if data<10) # 你看,打印r時(shí)并不會(huì)輸出結(jié)果 print(r) # 現(xiàn)在就可以了 # enumerate同時(shí)返回下標(biāo)和元素 for i, j in enumerate(r): print(i, j)
at 0x7f7c93644db0> 0 3 1 4 2 2 3 8 4 5 5 7
需要注意的事,生成器表達(dá)式一次只能用一次迭達(dá),上面我們對(duì)r進(jìn)行了一次迭代,如果再次輸出就是空的。
關(guān)于什么是生成器我們下次再講。
如果我們需要找出列表中的某個(gè)數(shù)據(jù)?或者是某一部分的數(shù)據(jù)?
使用切片。切片不僅對(duì)列表有用,同樣適用于元組和字符串。切片中以冒號(hào)間隔,前兩個(gè)參數(shù)為起始點(diǎn),第三個(gè)為步長(zhǎng),也就是每隔幾個(gè)找一個(gè)出來(lái)。
a = [2, 3, "a", 6, 4] print(a[3:4]) b = "hahahah" # 步長(zhǎng)為2 print(b[::2]) # 如果步長(zhǎng)設(shè)為1,就是從后往前取值 # 對(duì)b取反 print(b[::-1]) c = (2, 2, 3, 4, 5) print(c[:3])
[6] hhhh hahahah (2, 2, 3)
每次都用數(shù)字表示切片的起始點(diǎn)看起來(lái)很麻煩對(duì)不對(duì),還要記住從哪開(kāi)始從哪結(jié)束。如果你需要對(duì)很多不同的數(shù)據(jù)都執(zhí)行同樣的切片操作,最好是為切片命名,這樣只需定義一次就行了。切片命名使用slice方法,內(nèi)部參數(shù)與切片一樣。
items = [1, 2, 3, 4, 5, 6, 7] # slice用來(lái)對(duì)切片命名,比如規(guī)定這個(gè)切片是從2到4,2個(gè)步長(zhǎng),然后就可以使用了 a = slice(2, 4) print(a) print(items[a]) # 其它的數(shù)據(jù)也能用 itemss = [1, 2, 4, 6, 5, 6, 7] print(itemss[a])
slice(2, 4, None) [3, 4] [4, 6]
還有一個(gè)技巧叫做拆包,就是把一個(gè)列表或者字符同時(shí)賦值給多個(gè)變量,任何可迭代對(duì)象(也就是能夠用for循環(huán))都可以使用拆包。比如有一個(gè)函數(shù)返回了多個(gè)數(shù)據(jù),我們?cè)谡{(diào)用時(shí)就可以直接賦值給多個(gè)變量,而不用再定義一個(gè)數(shù)據(jù)類型,然后再賦值。多麻煩啊。
a, b, c = [1, 2, 4] print(a) a, b = "it" print(a)
1 i
有一個(gè)問(wèn)題,如果我的數(shù)據(jù)很多,難道要一個(gè)一個(gè)賦值給變量。多麻煩啊。對(duì)剩余的的數(shù)據(jù),使用星號(hào)代替即可。如果數(shù)據(jù)不是你需要的,使用_代替,使用其它的字符也是可以的,這只是一個(gè)約定而已。
# 可以這樣 data = [1, 2, 3, 4, 5, 6] a, b, *r = data print(r) # 也可以這樣 *a, b, c, d = data print(a)
[3, 4, 5, 6] [1, 2, 3]
最后一個(gè)技巧。
如果我們需要統(tǒng)計(jì)一個(gè)序列(字符串、列表、元組)中某個(gè)元素出現(xiàn)的次數(shù),怎么實(shí)現(xiàn)?循環(huán)這個(gè)序列,利用元素的下標(biāo),如果某個(gè)元素出現(xiàn)則加1,想想都麻煩。使用collections.Counter。counter中有個(gè)most_common方法,接受需要統(tǒng)計(jì)的元素個(gè)數(shù)作為參數(shù)。例子如下:
words = [ "look", "into", "my", "eyes", "look", "into", "my", "eyes", "the", "eyes", "the", "eyes", "the", "eyes", "not", "around", "the", "eyes", "don"t", "look", "around", "the", "eyes", "look", "into", "my", "eyes", "you"re", "under" ] from collections import Counter word_counts = Counter(words) # 出現(xiàn)頻率最高的3個(gè)單詞 top_three = word_counts.most_common(3) print(top_three)
[("eyes", 8), ("the", 5), ("look", 4)]
限于篇幅,還有許多awesome的技巧沒(méi)有涉及,下篇文章我們?cè)僦v。希望上面說(shuō)的一些東西對(duì)你有幫助。
本人才疏學(xué)淺,上文中難免有些錯(cuò)誤,還請(qǐng)各位品評(píng)指正。如果覺(jué)得寫(xiě)的還行,歡迎關(guān)注我的公眾號(hào)MLGroup,帶你走進(jìn)機(jī)器學(xué)習(xí)的世界。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/44537.html
摘要:字典和集合都是基于散列表實(shí)現(xiàn)的,散列表也就是表,了解過(guò)數(shù)據(jù)結(jié)構(gòu)的應(yīng)該知道。而使用另一種辦法,任何鍵在找不到的情況下都會(huì)用中的值數(shù)據(jù)類型比如替換。在設(shè)計(jì)時(shí)就可以使用創(chuàng)建你的數(shù)據(jù)接口。 這次主要說(shuō)說(shuō)字典和集合這兩種數(shù)據(jù)類型。 字典和集合都是基于散列表實(shí)現(xiàn)的,散列表也就是hash表,了解過(guò)數(shù)據(jù)結(jié)構(gòu)的應(yīng)該知道。與散列表相關(guān)的一個(gè)概念叫做可散列,什么是可散列?在python官方定義中是這樣說(shuō)的:...
摘要:擠掉了堆中實(shí)現(xiàn)了堆排序。你可以用堆排序來(lái)查找一個(gè)序列中最大的或者最小的幾個(gè)元素。除了使用堆排序,中還有排序和,這兩個(gè)排序最終生成以列表表示的排序結(jié)果,堆排序也是。 這次我們來(lái)說(shuō)說(shuō)python中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)然了,不會(huì)講很基礎(chǔ)的內(nèi)容。 用過(guò)python的都知道,python有著與其他語(yǔ)言很不一樣的數(shù)據(jù)類型,像什么列表、元組、集合、字典之類。這些數(shù)據(jù)類型造就了python簡(jiǎn)單易用同時(shí)又很強(qiáng)...
摘要:在中,特殊方法以雙下劃線開(kāi)始,以雙下劃線結(jié)束。真假值,如果向量模為,返回實(shí)現(xiàn)向量加法實(shí)現(xiàn)向量乘法,例如返回向量的模返回歐幾里德范數(shù)找個(gè)例子運(yùn)行下。怎么辦中有個(gè)特殊方法,可以修改控制臺(tái)輸出的樣式。 什么是特殊方法?當(dāng)我們?cè)谠O(shè)計(jì)一個(gè)類的時(shí)候,python中有一個(gè)用于初始化的方法$__init__$,類似于java中的構(gòu)造器,這個(gè)就是特殊方法,也叫作魔術(shù)方法。簡(jiǎn)單來(lái)說(shuō),特殊方法可以給你設(shè)計(jì)的...
摘要:來(lái)說(shuō)說(shuō)迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。有點(diǎn)繞是不是,其實(shí),一般只要知道可迭代對(duì)象以及它是如何實(shí)現(xiàn)的就行了,中常常用生成器來(lái)代替迭代器,可以說(shuō),生成器就是迭代器。 來(lái)說(shuō)說(shuō)迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。 之前簡(jiǎn)單的提到過(guò),一個(gè)對(duì)象是可迭代的可以理解為能夠使用for循環(huán)。這樣說(shuō)其實(shí)不太準(zhǔn)確,某個(gè)對(duì)象可迭代是因?yàn)樗鼉?nèi)部實(shí)現(xiàn)了$__iter__$這個(gè)特殊方法。比如在...
摘要:先不講數(shù)據(jù)結(jié)構(gòu)了,這次來(lái)說(shuō)說(shuō)中一些不被注意的功能。直接交換第二個(gè)功能。對(duì)的長(zhǎng)度使用生成一個(gè)序列,然后遍歷或者這樣第三個(gè)功能。其實(shí)還接受第二個(gè)參數(shù),它的作用是在迭代的過(guò)程中如果碰到第二個(gè)參數(shù)則停止。 先不講數(shù)據(jù)結(jié)構(gòu)了,這次來(lái)說(shuō)說(shuō)python中一些不被注意的功能。 在python的設(shè)計(jì)哲學(xué)中,有這么一條內(nèi)容:Simple is better than complex,簡(jiǎn)單的代碼比復(fù)雜的要好...
閱讀 2679·2021-10-14 09:42
閱讀 1220·2021-09-22 15:09
閱讀 3633·2021-09-09 09:33
閱讀 3094·2021-09-07 09:59
閱讀 3735·2021-09-03 10:34
閱讀 3683·2021-07-26 22:01
閱讀 2889·2019-08-30 13:06
閱讀 1267·2019-08-30 10:48