Python高級數(shù)據(jù)結(jié)構(gòu)(一)

數(shù)據(jù)結(jié)構(gòu)

數(shù)據(jù)結(jié)構(gòu)的概念很好理解娘侍,就是用來將數(shù)據(jù)組織在一起的結(jié)構(gòu)着降。換句話說差油,數(shù)據(jù)結(jié)構(gòu)是用來存儲一系列關(guān)聯(lián)數(shù)據(jù)的東西。在Python中有四種內(nèi)建的數(shù)據(jù)結(jié)構(gòu)任洞,分別是List蓄喇、Tuple、Dictionary以及Set交掏。大部分的應(yīng)用程序不需要其他類型的數(shù)據(jù)結(jié)構(gòu)妆偏,但若是真需要也有很多高級數(shù)據(jù)結(jié)構(gòu)可供選擇,例如Collection耀销、Array楼眷、Heapq铲汪、Bisect、Weakref罐柳、Copy以及Pprint掌腰。本文將介紹這些數(shù)據(jù)結(jié)構(gòu)的用法,看看它們是如何幫助我們的應(yīng)用程序的张吉。

關(guān)于四種內(nèi)建數(shù)據(jù)結(jié)構(gòu)的使用方法很簡單齿梁,并且網(wǎng)上有很多參考資料,因此本文將不會討論它們肮蛹。

1. Collections

1.1 Counter()

如果你想統(tǒng)計一個單詞在給定的序列中一共出現(xiàn)了多少次勺择,諸如此類的操作就可以用到Counter。來看看如何統(tǒng)計一個list中出現(xiàn)的item次數(shù):

from collections import Counter
 
li = ["Dog", "Cat", "Mouse", 42, "Dog", 42, "Cat", "Dog"]
a = Counter(li)
print a 
#Counter({'Dog': 3, 42: 2, 'Cat': 2, 'Mouse': 1})

若要統(tǒng)計一個list中不同單詞的數(shù)目伦忠,可以這么用:

from collections import Counter
 
li = ["Dog", "Cat", "Mouse", 42, "Dog", 42, "Cat", "Dog"]
a = Counter(li)
print a # Counter({'Dog': 3, 42: 2, 'Cat': 2, 'Mouse': 1})
 
print len(set(li)) # 4

如果需要對結(jié)果進(jìn)行分組省核,可以這么做:

from collections import Counter
 
li = ["Dog", "Cat", "Mouse","Dog","Cat", "Dog"]
a = Counter(li)
 
print a # Counter({'Dog': 3, 'Cat': 2, 'Mouse': 1})
 
print "{0} : {1}".format(a.values(),a.keys())  # [1, 3, 2] : ['Mouse', 'Dog', 'Cat']
 
print(a.most_common(3)) # [('Dog', 3), ('Cat', 2), ('Mouse', 1)]
1.2 deque

deque即雙頭隊列,隊列元素能夠在隊列兩端添加或刪除昆码。Deque支持線程安全的气忠,經(jīng)過優(yōu)化的append和pop操作,在隊列兩端的相關(guān)操作都能達(dá)到近乎O(1)的時間復(fù)雜度赋咽。

以下的例子是執(zhí)行基本的隊列操作:

from collections import deque
q = deque(range(5))
q.append(5)
q.appendleft(6)
print q
print q.pop()
print q.popleft()
print q.rotate(3)
print q
print q.rotate(-1)
print q
 
# deque([6, 0, 1, 2, 3, 4, 5])
# 5
# 6
# None
# deque([2, 3, 4, 0, 1])
# None
# deque([3, 4, 0, 1, 2])
1.3 defaultdict

當(dāng)查找一個不存在的鍵操作發(fā)生時旧噪,它的default_factory會被調(diào)用,提供一個默認(rèn)的值脓匿,并將這對鍵值存儲下來淘钟。其他的參數(shù)同普通的字典一致。

defaultdict對象可以用來追蹤單詞的位置陪毡,如:

from collections import defaultdict
 
s = "the quick brown fox jumps over the lazy dog"
 
words = s.split()
location = defaultdict(list)
for m, n in enumerate(words):
    location[n].append(m)
 
print location
 
# defaultdict(<type 'list'>, {'brown': [2], 'lazy': [7], 'over': [5], 'fox': [3],
# 'dog': [8], 'quick': [1], 'the': [0, 6], 'jumps': [4]})

是選擇lists或sets與defaultdict搭配取決于你的目的米母,使用list能夠保存你插入元素的順序,而使用set則不關(guān)心元素插入順序缤骨,它會幫助消除重復(fù)元素爱咬。

from collections import defaultdict
 
s = "the quick brown fox jumps over the lazy dog"
 
words = s.split()
location = defaultdict(set)
for m, n in enumerate(words):
    location[n].add(m)
 
print location
 
# defaultdict(<type 'set'>, {'brown': set([2]), 'lazy': set([7]),
# 'over': set([5]), 'fox': set([3]), 'dog': set([8]), 'quick': set([1]),
# 'the': set([0, 6]), 'jumps': set([4])})

另一種創(chuàng)建multidict的方法:

s = "the quick brown fox jumps over the lazy dog"
d = {}
words = s.split()
 
for key, value in enumerate(words):
    d.setdefault(key, []).append(value)
print d
 
# {0: ['the'], 1: ['quick'], 2: ['brown'], 3: ['fox'], 4: ['jumps'], 5: ['over'], 6: ['the'], 7: ['lazy'], 8: ['dog']}

一個更復(fù)雜的例子:

class Example(dict):
    def __getitem__(self, item):
        try:
            return dict.__getitem__(self, item)
        except KeyError:
            value = self[item] = type(self)()
            return value
 
a = Example()
 
a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6
 
print a # {1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市绊起,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燎斩,老刑警劉巖虱歪,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異栅表,居然都是意外死亡笋鄙,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門怪瓶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來萧落,“玉大人,你說我怎么就攤上這事≌裔” “怎么了陨倡?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長许布。 經(jīng)常有香客問我兴革,道長,這世上最難降的妖魔是什么蜜唾? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任杂曲,我火速辦了婚禮,結(jié)果婚禮上袁余,老公的妹妹穿的比我還像新娘擎勘。我一直安慰自己,他們只是感情好颖榜,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布货抄。 她就那樣靜靜地躺著,像睡著了一般朱转。 火紅的嫁衣襯著肌膚如雪蟹地。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天藤为,我揣著相機(jī)與錄音怪与,去河邊找鬼。 笑死缅疟,一個胖子當(dāng)著我的面吹牛分别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播存淫,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耘斩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了桅咆?” 一聲冷哼從身側(cè)響起括授,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岩饼,沒想到半個月后荚虚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡籍茧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年版述,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寞冯。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡渴析,死狀恐怖晚伙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情俭茧,我是刑警寧澤咆疗,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站恢恼,受9級特大地震影響民傻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜场斑,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一漓踢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漏隐,春花似錦喧半、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脖隶,卻和暖如春扁耐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背产阱。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工婉称, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人构蹬。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓王暗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庄敛。 傳聞我的和親對象是個殘疾皇子俗壹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容