Python奇遇記:數據結構窺探

此次咱們來講說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,帶你走進機器學習的世界。
圖片描述

相關文章
相關標籤/搜索