国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Python奇遇記:數據結構窺探

mrli2016 / 958人閱讀

摘要:擠掉了堆中實現了堆排序。你可以用堆排序來查找一個序列中最大的或者最小的幾個元素。除了使用堆排序,中還有排序和,這兩個排序最終生成以列表表示的排序結果,堆排序也是。

這次我們來說說python中的數據結構。當然了,不會講很基礎的內容。

用過python的都知道,python有著與其他語言很不一樣的數據類型,像什么列表、元組、集合、字典之類。這些數據類型造就了python簡單易用同時又很強大的特性。一般來說,我們會將python中的數據類型分為可變和不可變類型,可變的意思就是你可以修改像列表中的數據,不可變當然就是不能修改啦。還有一種分法是分為扁平類型和容器類型,其中扁平類型存放的是實際的值,包括str, bytes, bytearray,array.array這些,而容器類型存放的是數據值的引用,包括list,tuple,collections.deque這些。

既然是講數據結構,我們來看看python中不經常用到的一些數據類型。

數組

沒錯,python是有數組類型的。當你有很大的數據需要處理的時候,它比列表更高效。如何創建一個數組?使用array.array。比如我們創建一萬個隨機浮點數。

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方法。

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接受一個函數。

在下面的例子中,我們需要對字典按價格大小來排序查找。

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,帶你走進機器學習的世界。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44512.html

相關文章

  • Python奇遇數據結構窺探2

    摘要:找出列表中小于的數據除了列表推導式,還有字典推導式,集合推導式,用法都一樣。如果你的數據量很大的話,考慮使用生成器表達式。切片不僅對列表有用,同樣適用于元組和字符串。切片命名使用方法,內部參數與切片一樣。對剩余的的數據,使用星號代替即可。 上次我們講了幾個不常見的數據類型,每個都有自己特殊的用途,雖然不經常用到,了解一下也好。比如我們提到的數組類型,如果在數據量很大的時候同時要效率,就...

    Ocean 評論0 收藏0
  • python奇遇數據結構窺探3

    摘要:字典和集合都是基于散列表實現的,散列表也就是表,了解過數據結構的應該知道。而使用另一種辦法,任何鍵在找不到的情況下都會用中的值數據類型比如替換。在設計時就可以使用創建你的數據接口。 這次主要說說字典和集合這兩種數據類型。 字典和集合都是基于散列表實現的,散列表也就是hash表,了解過數據結構的應該知道。與散列表相關的一個概念叫做可散列,什么是可散列?在python官方定義中是這樣說的:...

    toddmark 評論0 收藏0
  • Python奇遇:特殊方法窺探

    摘要:在中,特殊方法以雙下劃線開始,以雙下劃線結束。真假值,如果向量模為,返回實現向量加法實現向量乘法,例如返回向量的模返回歐幾里德范數找個例子運行下。怎么辦中有個特殊方法,可以修改控制臺輸出的樣式。 什么是特殊方法?當我們在設計一個類的時候,python中有一個用于初始化的方法$__init__$,類似于java中的構造器,這個就是特殊方法,也叫作魔術方法。簡單來說,特殊方法可以給你設計的...

    niceforbear 評論0 收藏0
  • python奇遇:迭代器和生成器

    摘要:來說說迭代器和生成器,還有可迭代對象和生成器表達式。有點繞是不是,其實,一般只要知道可迭代對象以及它是如何實現的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對象和生成器表達式。 之前簡單的提到過,一個對象是可迭代的可以理解為能夠使用for循環。這樣說其實不太準確,某個對象可迭代是因為它內部實現了$__iter__$這個特殊方法。比如在...

    atinosun 評論0 收藏0
  • python奇遇:隱藏的python功能

    摘要:先不講數據結構了,這次來說說中一些不被注意的功能。直接交換第二個功能。對的長度使用生成一個序列,然后遍歷或者這樣第三個功能。其實還接受第二個參數,它的作用是在迭代的過程中如果碰到第二個參數則停止。 先不講數據結構了,這次來說說python中一些不被注意的功能。 在python的設計哲學中,有這么一條內容:Simple is better than complex,簡單的代碼比復雜的要好...

    APICloud 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<