此次咱們來講說python中的數據結構。固然了,不會講很基礎的內容。python
用過python的都知道,python有着與其餘語言很不同的數據類型,像什麼列表、元組、集合、字典之類。這些數據類型造就了python簡單易用同時又很強大的特性。通常來講,咱們會將python中的數據類型分爲可變和不可變類型,可變的意思就是你能夠修改像列表中的數據,不可變固然就是不能修改啦。還有一種分法是分爲扁平類型和容器類型,其中扁平類型存放的是實際的值,包括str, bytes, bytearray,array.array這些,而容器類型存放的是數據值的引用,包括list,tuple,collections.deque這些。數組
既然是講數據結構,咱們來看看python中不常常用到的一些數據類型。數據結構
沒錯,python是有數組類型的。當你有很大的數據須要處理的時候,它比列表更高效。如何建立一個數組?使用array.array。好比咱們建立一萬個隨機浮點數。app
from array import array from random import random # array中的第一個參數表明數據類型,好比float,char等。第二個參數爲可迭代的數據。 # d表明雙精度浮點類型 data = array('d', (random() for i in range(10**7))) # 輸出最後一個元素看看 print(data[-1])
0.5888905969627429
數組中提供了一些頗有用的方法來處理數據,好比pop,insert,同時也有寫入文件的tofile和讀取的frombytes方法。dom
with open('data.bin', 'wb') as fp: data.tofile(fp)
學過數據結構的都知道隊列,雙端隊列就是兩邊均可以進出的隊列。python中的雙端隊列使用collections.deque表示。固然了你若是想用它來表示棧也是沒問題的。append方法用來添加,pop方法用來彈出。怎麼使用?機器學習
from collections import deque data = deque(range(10), maxlen = 3) print(data)
deque([7, 8, 9], maxlen=3)
如上所示,第一個參數爲數據,第二個參數是隊列的最大長度,若是不指定則默認爲無限長。若是限制了長度,則增長數據會擠掉最早插入的數據。函數
data.append(3) # 擠掉了7 print(data) data.pop() print(data)
deque([8, 9, 3], maxlen=3) deque([8, 9], maxlen=3)
python中實現了堆排序。你能夠用堆排序來查找一個序列中最大的或者最小的幾個元素。好比咱們有一個列表:學習
import heapq nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2] # 找出最大的幾個 print(heapq.nlargest(3, nums)) # Prints [42, 37, 23] # 找出最小的幾個 print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]
[42, 37, 23] [-4, 1, 2]
使用nlargest能夠找出最大的幾個元素,相反的nsmalllest找最小的幾個元素。若是須要找的是字典類型呢?還有第三個參數key,指定咱們對數據進行的操做,key接受一個函數。spa
在下面的例子中,咱們須要對字典按價格大小來排序查找。code
portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65} ] # key接受一個匿名函數,這個函數的做用是找出字典中price的值。 cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price']) expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price']) print(cheap) print(expensive)
[{'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}] [{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'ACME', 'shares': 75, 'price': 115.65}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]
若是你僅僅想查找惟一的最小或最大(N=1)的元素的話,那麼使用 min() 和 max() 函數會更快些。
除了使用堆排序,python中還有sorted排序和list.sorted,這兩個排序最終生成以列表表示的排序結果,堆排序也是。不過sorted在排序時會新建一個列表再進行排序,而list.sorted會直接對數據進行就地排序,並且要求輸入的數據必須爲列表。
什麼是具名元組?有時候咱們須要用一個類來表示某個事物,可是並不想定義一個類而後咔噠咔噠寫一大段類的表示,這個時候就可使用具名元組,它能夠用來快速生成類。比方說定義一個學生類,屬性包括姓名,年齡,學號:
from collections import namedtuple # 第一個參數是類的名字,第二個參數爲類中的數據,能夠爲字符串,或者字符串組成的列表 Student = namedtuple("Student", ['name', 'age', 'id']) Studen = namedtuple("Studen", "name age id") s1 = Studen('zhuzhezhe', '23', '001') s2 = Student('zhuzhezhe', '23', '001') print(s1) print(s2)
Studen(name='zhuzhezhe', age='23', id='001') Student(name='zhuzhezhe', age='23', id='001')
具名元組放在collections模塊下的nametuple中,第一個參數是類的名字,第二個參數爲類中的數據,能夠爲字符串,或者字符串組成的列表。
以上就是一些不太常見的數據類型的介紹,固然不止這些,具體能夠看看python官方手冊。
下次咱們來講說python中常見數據類型的一些不常見的用法,若是用到了效率會翻倍。
本人才疏學淺,上文中不免有些錯誤,還請各位品評指正。若是以爲寫的還行,歡迎關注個人公衆號MLGroup,帶你走進機器學習的世界。