成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python奇遇記:數(shù)據(jù)結(jié)構(gòu)窺探

mrli2016 / 964人閱讀

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

這次我們來說說python中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)然了,不會(huì)講很基礎(chǔ)的內(nèi)容。

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

既然是講數(shù)據(jù)結(jié)構(gòu),我們來看看python中不經(jīng)常用到的一些數(shù)據(jù)類型。

數(shù)組

沒錯(cuò),python是有數(shù)組類型的。當(dāng)你有很大的數(shù)據(jù)需要處理的時(shí)候,它比列表更高效。如何創(chuàng)建一個(gè)數(shù)組?使用array.array。比如我們創(chuàng)建一萬個(gè)隨機(jī)浮點(diǎn)數(shù)。

from array import array

from random import  random
# array中的第一個(gè)參數(shù)代表數(shù)據(jù)類型,比如float,char等。第二個(gè)參數(shù)為可迭代的數(shù)據(jù)。
# d代表雙精度浮點(diǎn)類型
data = array("d", (random() for i in range(10**7)))
# 輸出最后一個(gè)元素看看
print(data[-1])
0.5888905969627429

數(shù)組中提供了一些很有用的方法來處理數(shù)據(jù),比如pop,insert,同時(shí)也有寫入文件的tofile和讀取的frombytes方法。

with open("data.bin", "wb") as fp:
    data.tofile(fp)
雙端隊(duì)列

學(xué)過數(shù)據(jù)結(jié)構(gòu)的都知道隊(duì)列,雙端隊(duì)列就是兩邊都可以進(jìn)出的隊(duì)列。python中的雙端隊(duì)列使用collections.deque表示。當(dāng)然了你如果想用它來表示棧也是沒問題的。append方法用來添加,pop方法用來彈出。怎么使用?

from collections import deque
data = deque(range(10), maxlen = 3)
print(data)
deque([7, 8, 9], maxlen=3)

如上所示,第一個(gè)參數(shù)為數(shù)據(jù),第二個(gè)參數(shù)是隊(duì)列的最大長(zhǎng)度,如果不指定則默認(rèn)為無限長(zhǎng)。如果限制了長(zhǎng)度,則增加數(shù)據(jù)會(huì)擠掉最先插入的數(shù)據(jù)。

data.append(3)
# 擠掉了7
print(data)
data.pop()
print(data)
deque([8, 9, 3], maxlen=3)
deque([8, 9], maxlen=3)

python中實(shí)現(xiàn)了堆排序。你可以用堆排序來查找一個(gè)序列中最大的或者最小的幾個(gè)元素。比如我們有一個(gè)列表:

import heapq
nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]

# 找出最大的幾個(gè)
print(heapq.nlargest(3, nums)) # Prints [42, 37, 23]
# 找出最小的幾個(gè)
print(heapq.nsmallest(3, nums)) # Prints [-4, 1, 2]
[42, 37, 23]
[-4, 1, 2]

使用nlargest可以找出最大的幾個(gè)元素,相反的nsmalllest找最小的幾個(gè)元素。如果需要找的是字典類型呢?還有第三個(gè)參數(shù)key,指定我們對(duì)數(shù)據(jù)進(jìn)行的操作,key接受一個(gè)函數(shù)。

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

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接受一個(gè)匿名函數(shù),這個(gè)函數(shù)的作用是找出字典中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() 函數(shù)會(huì)更快些。

除了使用堆排序,python中還有sorted排序和list.sorted,這兩個(gè)排序最終生成以列表表示的排序結(jié)果,堆排序也是。不過sorted在排序時(shí)會(huì)新建一個(gè)列表再進(jìn)行排序,而list.sorted會(huì)直接對(duì)數(shù)據(jù)進(jìn)行就地排序,而且要求輸入的數(shù)據(jù)必須為列表。

具名元組

什么是具名元組?有時(shí)候我們需要用一個(gè)類來表示某個(gè)事物,但是并不想定義一個(gè)類然后咔噠咔噠寫一大段類的表示,這個(gè)時(shí)候就可以使用具名元組,它可以用來快速生成類。比方說定義一個(gè)學(xué)生類,屬性包括姓名,年齡,學(xué)號(hào):

from collections import namedtuple

# 第一個(gè)參數(shù)是類的名字,第二個(gè)參數(shù)為類中的數(shù)據(jù),可以為字符串,或者字符串組成的列表
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中,第一個(gè)參數(shù)是類的名字,第二個(gè)參數(shù)為類中的數(shù)據(jù),可以為字符串,或者字符串組成的列表。

以上就是一些不太常見的數(shù)據(jù)類型的介紹,當(dāng)然不止這些,具體可以看看python官方手冊(cè)。

下次我們來說說python中常見數(shù)據(jù)類型的一些不常見的用法,如果用到了效率會(huì)翻倍。


本人才疏學(xué)淺,上文中難免有些錯(cuò)誤,還請(qǐng)各位品評(píng)指正。如果覺得寫的還行,歡迎關(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://systransis.cn/yun/44512.html

相關(guān)文章

  • Python奇遇數(shù)據(jù)結(jié)構(gòu)窺探2

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

    Ocean 評(píng)論0 收藏0
  • python奇遇數(shù)據(jù)結(jié)構(gòu)窺探3

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

    toddmark 評(píng)論0 收藏0
  • Python奇遇:特殊方法窺探

    摘要:在中,特殊方法以雙下劃線開始,以雙下劃線結(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)單來說,特殊方法可以給你設(shè)計(jì)的...

    niceforbear 評(píng)論0 收藏0
  • python奇遇:迭代器和生成器

    摘要:來說說迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。有點(diǎn)繞是不是,其實(shí),一般只要知道可迭代對(duì)象以及它是如何實(shí)現(xiàn)的就行了,中常常用生成器來代替迭代器,可以說,生成器就是迭代器。 來說說迭代器和生成器,還有可迭代對(duì)象和生成器表達(dá)式。 之前簡(jiǎn)單的提到過,一個(gè)對(duì)象是可迭代的可以理解為能夠使用for循環(huán)。這樣說其實(shí)不太準(zhǔn)確,某個(gè)對(duì)象可迭代是因?yàn)樗鼉?nèi)部實(shí)現(xiàn)了$__iter__$這個(gè)特殊方法。比如在...

    atinosun 評(píng)論0 收藏0
  • python奇遇:隱藏的python功能

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

    APICloud 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<