[零基礎學Python]字典,你還記得嗎?

字典,這個東西你如今還用嗎?隨着網絡的發展,用的人愈來愈少了。很多人習慣於在網上搜索,不只有web版,乃至於已經有手機版的各類字典了。我曾經用過一本小小的《新華字典》。python

《新華字典》是中國第一部現代漢語字典。最先的名字叫《伍記小字典》,但未能編纂完成。自1953年,開始重編,其凡例徹底採用《伍記小字典》。從1953年開始出版,通過反覆修訂,可是以1957年商務印書館出版的《新華字典》做爲初版。起因新華辭書社編寫,1956年併入中科院語言研究所(現中國社科院語言研究所)詞典編輯室。新華字典由商務印書館出版。歷經幾代上百名專家學者10餘次大規模的修訂,重印200屢次。成爲迄今爲止世界出版史上最高發行量的字典。git

這裏講到字典,不是爲了敘舊。而是提醒看官想一想咱們如何使用字典:先查索引(不論是拼音仍是偏旁查字),而後經過索引找到相應內容。github

這種方法可以快捷的找到目標。web

在python中,也有一種數據與此相近,不只相近,這種數據的名稱就叫作dictionary,翻譯過來是字典,相似於前面的int/str/list,這種類型數據名稱是:dict數組

依據管理,要知道如何創建dict和它有關屬性方法。安全

由於已經有了此前的基礎,因此,學這個就能夠加快了。網絡

前面曾經建議看官一個很好的學習探究方法,好比想了解str的有關屬性方法,能夠在交互模式下使用:數據結構

>>>help(str)

將獲得全部的有關內容。ssh

如今換一個,使用dir,也能獲得相同的結果。只是簡單一些罷了。請在交互模式下:函數

>>> dir(dict)
['__class__', '__cmp__', '__contains__', '__delattr__', '__delitem__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values', 'viewitems', 'viewkeys', 'viewvalues']

以__(雙下劃線)開頭的先無論。看後面的。若是要想深刻了解,能夠這樣:

>>> help(dict.values)

而後出現:

Help on method_descriptor:

values(...)
    D.values() -> list of D's values
(END)

也就是在這裏顯示出了values這個內置函數的使用方法。敲擊鍵盤上的q鍵退回。

概述

python中的dict具備以下特色:

  • dict是可變的
  • dict能夠存儲任意數量的Python對象
  • dict能夠存儲任何python數據類型
  • dict以:key:value,即「鍵:值」對的形式存儲數據,每一個鍵是惟一的。
  • dict也被稱爲關聯數組或哈希表。

以上諸條,若是還不是很理解,也沒有關係,經過下面的學習,特別是經過各類實驗,就能理解了。

建立dict

話說建立dict的方法但是遠遠多於前面的int/str/list,爲何會多呢?通常規律是複雜點的東西都會有多種渠道生成,這也是從安全便捷角度考慮吧。

方法1:

建立一個空的dict,這個空dict,能夠在之後向裏面加東西用。

>>> mydict = {}
>>> mydict
{}

建立有內容的dict。

>>> person = {"name":"qiwsir","site":"qiwsir.github.io","language":"python"}
>>> person
{'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}

"name":"qiwsir"就是一個鍵值對,前面的name叫作鍵(key),後面的qiwsir是前面的鍵所對應的值(value)。在一個dict中,鍵是惟一的,不能重複;值則是對應於鍵,值能夠重複。鍵值之間用(:)英文的分號,每一對鍵值之間用英文的逗號(,)隔開。

>>> person['name2']="qiwsir"    #這是一種向dict中增長鍵值對的方法
>>> person
{'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}

以下,演示了從一個空的dict開始增長內容的過程:

>>> mydict = {}
>>> mydict
{}
>>> mydict["site"] = "qiwsir.github.io"
>>> mydict[1] = 80
>>> mydict[2] = "python"
>>> mydict["name"] = ["zhangsan","lisi","wangwu"]
>>> mydict
{1: 80, 2: 'python', 'site': 'qiwsir.github.io', 'name': ['zhangsan', 'lisi', 'wangwu']}

>>> mydict[1] = 90  #若是這樣,則是修改這個鍵的值
>>> mydict
{1: 90, 2: 'python', 'site': 'qiwsir.github.io', 'name': ['zhangsan', 'lisi', 'wangwu']}

方法2:

>>> name = (["first","Google"],["second","Yahoo"])      #這是另一種數據類型,稱之爲元組,後面會講到
>>> website = dict(name)
>>> website
{'second': 'Yahoo', 'first': 'Google'}

方法3:

這個方法,跟上面的不一樣在於使用fromkeys

>>> website = {}.fromkeys(("third","forth"),"facebook")
>>> website
{'forth': 'facebook', 'third': 'facebook'}

須要提醒的是,這種方法是重新創建一個dict。

訪問dict的值

由於dict是以鍵值對的形式存儲數據的,因此,只要知道鍵,就能獲得值。這本質上就是一種映射關係。

>>> person
{'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
>>> person['name']
'qiwsir'
>>> person['language']
'python'
>>> site = person['site']
>>> print site
qiwsir.github.io

如同前面所講,經過鍵可以增長dict中的值,經過鍵可以改變dict中的值,經過鍵也可以訪問dict中的值。

看官能夠跟list對比一下。若是咱們訪問list中的元素,能夠經過索引值獲得(list[i]),若是是讓機器來巡迴訪問,就能夠用for語句。複習一下:

>>> person_list = ["qiwsir","Newton","Boolean"]   
>>> for name in person_list:
...     print name
... 
qiwsir
Newton
Boolean

那麼,dict是否是也能夠用for語句來循環訪問呢?固然能夠,來看例子:

>>> person
{'name2': 'qiwsir', 'name': 'qiwsir', 'language': 'python', 'site': 'qiwsir.github.io'}
>>> for key in person:
...     print person[key]
... 
qiwsir
qiwsir
python
qiwsir.github.io

知識

什麼是關聯數組?如下解釋來自維基百科

在計算機科學中,關聯數組(英語:Associative Array),又稱映射(Map)、字典(Dictionary)是一個抽象的數據結構,它包含着相似於(鍵,值)的有序對。一個關聯數組中的有序對能夠重複(如C++中的multimap)也能夠不重複(如C++中的map)。

這種數據結構包含如下幾種常見的操做:

1.向關聯數組添加配對
2.從關聯數組內刪除配對
3.修改關聯數組內的配對
4.根據已知的鍵尋找配對

字典問題是設計一種可以具有關聯數組特性的數據結構。解決字典問題的經常使用方法,是利用散列表,但有些狀況下,也能夠直接使用有地址的數組,或二叉樹,和其餘結構。

許多程序設計語言內置基本的數據類型,提供對關聯數組的支持。而Content-addressable memory則是硬件層面上實現對關聯數組的支持。

什麼是哈希表?關於哈希表的敘述比較多,這裏僅僅截取了概念描述,更多的能夠到維基百科上閱讀

散列表(Hash table,也叫哈希表),是根據關鍵字(Key value)而直接訪問在內存存儲位置的數據結構。也就是說,它經過把鍵值經過一個函數的計算,映射到表中一個位置來訪問記錄,這加快了查找速度。這個映射函數稱作散列函數,存放記錄的數組稱作散列表。

相關文章
相關標籤/搜索