Python奇遇記:數據結構窺探2

上次咱們講了幾個不常見的數據類型,每一個都有本身特殊的用途,雖然不常常用到,瞭解一下也好。好比咱們提到的數組類型,若是在數據量很大的時候同時要效率,就可使用它。此次來講說python中常見的數據類型像列表、元組、字典、集合中的一些頗有用的技巧,幫助你提升開發效率。python

來看看。數組

列表有一個頗有用的技巧是使用列表推導式,這個你們可能都知道,若是你須要迭代列表中的數據,使用循環是個很麻煩的事,使用列表推導式一行就搞定。機器學習

datas = [3, 4, 2, 8, 12, 5, 7]
# 找出列表中小於10的數據
print([data for data in datas if data<10])
[3, 4, 2, 8, 5, 7]

除了列表推導式,還有字典推導式,集合推導式,用法都同樣。還有一個特殊的生成器表達式,生成器表達式並不會在剛開始就生成一個數據類型,而是在迭代時才生成,這樣能夠節省內存。若是你的數據量很大的話,考慮使用生成器表達式。生成器表達式使用小括號。函數

# 使用上面的數據
# 生成器表達式使用小括號
r = (data for data in datas if data<10)
# 你看,打印r時並不會輸出結果
print(r)
# 如今就能夠了
# enumerate同時返回下標和元素
for i, j in enumerate(r):
    print(i, j)
<generator object <genexpr> at 0x7f7c93644db0>
0 3
1 4
2 2
3 8
4 5
5 7

須要注意的事,生成器表達式一次只能用一次迭達,上面咱們對r進行了一次迭代,若是再次輸出就是空的。學習

關於什麼是生成器咱們下次再講。spa

若是咱們須要找出列表中的某個數據?或者是某一部分的數據?code

使用切片。切片不只對列表有用,一樣適用於元組和字符串。切片中以冒號間隔,前兩個參數爲起始點,第三個爲步長,也就是每隔幾個找一個出來。對象

a = [2, 3, 'a', 6, 4]
print(a[3:4])

b = 'hahahah'
# 步長爲2
print(b[::2])
# 若是步長設爲1,就是從後往前取值
# 對b取反
print(b[::-1])

c = (2, 2, 3, 4, 5)
print(c[:3])
[6]
hhhh
hahahah
(2, 2, 3)

每次都用數字表示切片的起始點看起來很麻煩對不對,還要記住從哪開始從哪結束。若是你須要對不少不一樣的數據都執行一樣的切片操做,最好是爲切片命名,這樣只需定義一次就好了。切片命名使用slice方法,內部參數與切片同樣。three

items = [1, 2, 3, 4, 5, 6, 7]
# slice用來對切片命名,好比規定這個切片是從2到4,2個步長,而後就可使用了
a = slice(2, 4)
print(a)
print(items[a])

# 其它的數據也能用
itemss = [1, 2, 4, 6, 5, 6, 7]
print(itemss[a])
slice(2, 4, None)
[3, 4]
[4, 6]

還有一個技巧叫作拆包,就是把一個列表或者字符同時賦值給多個變量,任何可迭代對象(也就是可以用for循環)均可以使用拆包。好比有一個函數返回了多個數據,咱們在調用時就能夠直接賦值給多個變量,而不用再定義一個數據類型,而後再賦值。多麻煩啊。圖片

a, b, c = [1, 2, 4]
print(a)
a, b = 'it'
print(a)
1
i

有一個問題,若是個人數據不少,難道要一個一個賦值給變量。多麻煩啊。對剩餘的的數據,使用星號代替便可。若是數據不是你須要的,使用_代替,使用其它的字符也是能夠的,這只是一個約定而已。

# 能夠這樣
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]

最後一個技巧。

若是咱們須要統計一個序列(字符串、列表、元組)中某個元素出現的次數,怎麼實現?循環這個序列,利用元素的下標,若是某個元素出現則加1,想一想都麻煩。使用collections.Counter。counter中有個most_common方法,接受須要統計的元素個數做爲參數。例子以下:

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)
# 出現頻率最高的3個單詞
top_three = word_counts.most_common(3)
print(top_three)
[('eyes', 8), ('the', 5), ('look', 4)]

限於篇幅,還有許多awesome的技巧沒有涉及,下篇文章咱們再講。但願上面說的一些東西對你有幫助。


本人才疏學淺,上文中不免有些錯誤,還請各位品評指正。若是以爲寫的還行,歡迎關注個人公衆號MLGroup,帶你走進機器學習的世界。
圖片描述

相關文章
相關標籤/搜索