字典,這個東西你現在還用嗎?隨著網絡的發展,用的人越來越少了。不少人習慣于在網上搜索,不僅有web版,乃至于已經有手機版的各種字典了。。我曾經用過一本小小的《新華字典》。
> 《新華字典》是中國第一部現代漢語字典。最早的名字叫《伍記小字典》,但未能編纂完成。自1953年,開始重編,其凡例完全采用《伍記小字典》。從1953年開始出版,經過反復修訂,但是以1957年商務印書館出版的《新華字典》作為第一版。原由新華辭書社編寫,1956年并入中科院語言研究所(現中國社科院語言研究所)詞典編輯室。新華字典由商務印書館出版。歷經幾代上百名專家學者10余次大規模的修訂,重印200多次。成為迄今為止世界出版史上最高發行量的字典。
這里講到字典,不是為了敘舊。而是提醒看官想想我們如何使用字典:先查索引(不管是拼音還是偏旁查字),然后通過索引找到相應內容。
這種方法能夠快捷的找到目標。
在python中,也有一種數據與此相近,不僅相近,這種數據的名稱就叫做dictionary,翻譯過來是字典,類似于前面的int/str/list,這種類型數據名稱是:dict
依據管理,要知道如何建立dict和它有關屬性方法。
因為已經有了此前的基礎,所以,學這個就可以加快了。
前面曾經建議看官一個很好的學習探究方法,比如想了解str的有關屬性方法,可以在交互模式下使用:
~~~
>>>help(str)
~~~
將得到所有的有關內容。
現在換一個,使用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鍵退回。
## [](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/120.md#概述)概述
python中的dict具有如下特點:
* dict是可變的
* dict可以存儲任意數量的Python對象
* dict可以存儲任何python數據類型
* dict以:key:value,即“鍵:值”對的形式存儲數據,每個鍵是唯一的。
* dict也被稱為關聯數組或哈希表。
以上諸條,如果還不是很理解,也沒有關系,通過下面的學習,特別是通過各種實驗,就能理解了。
## [](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/120.md#創建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。
## [](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/120.md#訪問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
~~~
## [](https://github.com/qiwsir/ITArticles/blob/master/BasicPython/120.md#知識)知識
什么是關聯數組?以下解釋來自[維基百科](http://zh.wikipedia.org/wiki/%E5%85%B3%E8%81%94%E6%95%B0%E7%BB%84)
> 在計算機科學中,關聯數組(英語:Associative Array),又稱映射(Map)、字典(Dictionary)是一個抽象的數據結構,它包含著類似于(鍵,值)的有序對。一個關聯數組中的有序對可以重復(如C++中的multimap)也可以不重復(如C++中的map)。
>
> 這種數據結構包含以下幾種常見的操作:
>
> > 1.向關聯數組添加配對 2.從關聯數組內刪除配對 3.修改關聯數組內的配對 4.根據已知的鍵尋找配對
>
> 字典問題是設計一種能夠具備關聯數組特性的數據結構。解決字典問題的常用方法,是利用散列表,但有些情況下,也可以直接使用有地址的數組,或二叉樹,和其他結構。
>
> 許多程序設計語言內置基本的數據類型,提供對關聯數組的支持。而Content-addressable memory則是硬件層面上實現對關聯數組的支持。
什么是哈希表?關于哈希表的敘述比較多,這里僅僅截取了概念描述,更多的可以到[維基百科上閱讀](http://zh.wikipedia.org/wiki/%E5%93%88%E5%B8%8C%E8%A1%A8)。
> 散列表(Hash table,也叫哈希表),是根據關鍵字(Key value)而直接訪問在內存存儲位置的數據結構。也就是說,它通過把鍵值通過一個函數的計算,映射到表中一個位置來訪問記錄,這加快了查找速度。這個映射函數稱做散列函數,存放記錄的數組稱做散列表。
- 第零部分 獨上高樓,望盡天涯路
- 嘮叨一些關于Python的事情
- 為什么要開設本欄目
- 第一部分 積小流,至江海
- Python環境安裝
- 集成開發環境(IDE)
- 數的類型和四則運算
- 啰嗦的除法
- 開始真正編程
- 初識永遠強大的函數
- 玩轉字符串(1):基本概念、字符轉義、字符串連接、變量與字符串關系
- 玩轉字符串(2)
- 玩轉字符串(3)
- 眼花繚亂的運算符
- 從if開始語句的征程
- 一個免費的實驗室
- 有容乃大的list(1)
- 有容乃大的list(2)
- 有容乃大的list(3)
- 有容乃大的list(4)
- list和str比較
- 畫圈還不簡單嗎
- 再深點,更懂list
- 字典,你還記得嗎?
- 字典的操作方法
- 有點簡約的元組
- 一二三,集合了
- 集合的關系
- Python數據類型總結
- 深入變量和引用對象
- 賦值,簡單也不簡單
- 坑爹的字符編碼
- 做一個小游戲
- 不要紅頭文件(1): open, write, close
- 不要紅頭文件(2): os.stat, closed, mode, read, readlines, readline
- 第二部分 窮千里目,上一層樓
- 正規地說一句話
- print能干的事情
- 從格式化表達式到方法
- 復習if語句
- 用while來循環
- 難以想象的for
- 關于循環的小伎倆
- 讓人歡喜讓人憂的迭代
- 大話題小函數(1)
- 大話題小函數(2)
- python文檔
- 重回函數
- 變量和參數
- 總結參數的傳遞
- 傳說中的函數條規
- 關于類的基本認識
- 編寫類之一創建實例
- 編寫類之二方法
- 編寫類之三子類
- 編寫類之四再論繼承
- 命名空間
- 類的細節
- Import 模塊
- 模塊的加載
- 私有和專有
- 折騰一下目錄: os.path.<attribute>
- 第三部分 昨夜西風,亭臺誰登
- 網站的結構:網站組成、MySQL數據庫的安裝和配置、MySQL的運行
- 通過Python連接數據庫:安裝python-MySQLdb,連接MySQL
- 用Pyton操作數據庫(1):建立連接和游標,并insert and commit
- 用Python操作數據庫(2)
- 用Python操作數據庫(3)
- python開發框架:框架介紹、Tornado安裝
- Hello,第一個網頁分析:tornado網站的基本結構剖析:improt模塊、RequestHandler, HTTPServer, Application, IOLoop
- 實例分析get和post:get()通過URL得到數據和post()通過get_argument()獲取數據
- 問候世界:利用GAE建立tornado框架網站
- 使用表單和模板:tornado模板self.render和模板變量傳遞
- 模板中的語法:tornado模板中的for,if,set等語法
- 靜態文件以及一個項目框架
- 模板轉義
- 第四部分 暮然回首,燈火闌珊處
- requests庫
- 比較json/dictionary的庫
- defaultdict 模塊和 namedtuple 模塊
- 第五部分 Python備忘錄
- 基本的(字面量)值
- 運算符
- 常用的內建函數
- 擴展閱讀(來自網絡文章)
- 人生苦短,我用Python