字典
字典也是python中的基礎(chǔ)數(shù)據(jù)類型础废。
提到字典你可能會(huì)想到讀書時(shí)用的新華字典,使用它你可以通過(guò)筆劃或者拼音定位到漢字罕模,在python中把筆劃或者拼音叫做鍵评腺,通過(guò)鍵找到的漢字稱作值,python中的字典就是由鍵值對(duì)組成的集合淑掌,這個(gè)集合中的每個(gè)鍵都是唯一的蒿讥,不可重復(fù)。
dict = {key1:value1,key2:value2,...,keyn:valuen}
字典舉例
dictex = {'1':'beijing', 2:'newyork', 'shanghai':'china'}
字典中的鍵和值可以是任意類型數(shù)據(jù),字典可以任意類型關(guān)聯(lián)任意類型抛腕。
操作字典
stuff = {'name':'damao', 'age':36, 'height':175}
- 索引
列表中芋绸,可通過(guò)從0開始的數(shù)字對(duì)列表中的元素進(jìn)行索引,如list1[1],list1[-2],list1[1:5],字典通過(guò)鍵進(jìn)行索引担敌,可返回相應(yīng)的值摔敛。以上例為例,stuff['name']返回‘damao’,stuff['age']返回36
- 增加
通過(guò)對(duì)鍵值對(duì)全封,可以給字典增加元素马昙,但鍵不能跟字典中的鍵重復(fù)。
stuff['weight'] = 70
stuff[1] = 'what'
stuff[2] = 'how'
- 刪除
清空字典使用clear函數(shù)刹悴,如stuff.clear()
刪除單個(gè)元素行楞,可使用關(guān)鍵字del,如del stuff[1]
還可以使用列表中也使用的pop函數(shù)刪除字典的元素并返回土匀,但字典中的pop函數(shù)至少有一個(gè)鍵參數(shù)子房,并不一定是刪除最后一個(gè)元素,字典中的數(shù)據(jù)是無(wú)序的恒削,所以并沒有第一個(gè)池颈,最后一個(gè)的說(shuō)法尾序。
如有一個(gè)字典
stuff = {'name':'damao', 'age':36,1:'test', 2:'a', 'height':175}
stuff.pop(1)可刪除鍵值對(duì)1:‘test’并返回‘test’
stuff.pop(3,'b')钓丰,不刪除任何字典元素但返回'b'
stuff.pop(2,'f')躯砰,刪除鍵值對(duì)2:'a',并返回'a'
使用popitem函數(shù)刪除并返回字典中的某個(gè)元素,如携丁,stuff.popitem()隨機(jī)刪除字典中的一對(duì)鍵值琢歇,并以tuple形式返回
- 修改
可通過(guò)已知鍵索引對(duì)字典進(jìn)行修改
stuff['age'] = 45 #修改年齡
教材舉例
cities = {'CA':'San Francisco', 'MI':'Detroit', 'FL':'Jacksonville'}
cities['NY'] = 'New York'
cities['OR'] = 'Portland'
def find_city(themap, state):
if state in themap:
return themap[state]
else:
return "Not Found"
cities['_find'] = find_city #關(guān)聯(lián)一個(gè)函數(shù)地址到字典中
while True:
print "State? (Enter to quit)",
state = raw_input("> ")
if not state: break
city_found = cities['_find'](cities, state)
print city_found
字典的大度是地球人都知道的,上例中就保存了一個(gè)函數(shù)地址在字典中梦鉴。
字典類型還有許多重要函數(shù)李茫,可通過(guò)查閱幫助文檔獲得。
如獲取字典中的鍵
| keys(...)
| D.keys() -> list of D's keys
獲取字典中的值
| values(...)
| D.values() -> list of D's values
獲取字典中的鍵值對(duì)
| items(...)
| D.items() -> list of D's (key, value) pairs, as 2-tuples
上例中有個(gè)隱藏的梗肥橙,那就是循環(huán)在啥情況下會(huì)退出魄宏?
if not state: break
state輸入什么值,python會(huì)認(rèn)為False?
state是通過(guò)raw_input函數(shù)獲得值的存筏,查看raw_input幫助
raw_input(...)
raw_input([prompt]) -> string
Read a string from standard input. The trailing newline is stripped.
If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.
On Unix, GNU readline is used if enabled. The prompt string, if given,
is printed without a trailing newline before reading.
1.raw_input函數(shù)的返回值是字符串
2.用戶觸發(fā)EOF宠互,拋出EOFError異常
EOF是什么鬼?
EOF椭坚,全稱END OF FILE,表示"文字流"(stream)的結(jié)尾予跌。這里的"文字流",可以是文件(file)善茎,也可以是標(biāo)準(zhǔn)輸入.
關(guān)于EOF有很多資料券册,這里截取一段
Linux中,在新的一行的開頭垂涯,按下Ctrl-D烁焙,就代表EOF(如果在一行的中間按下Ctrl-D,則表示輸出"標(biāo)準(zhǔn)輸入"的緩存區(qū)耕赘,所以這時(shí)必須按兩次Ctrl-D)考阱;Windows中,Ctrl-Z表示EOF鞠苟。(順便提一句乞榨,Linux中按下Ctrl-Z,表示將該進(jìn)程中斷当娱,在后臺(tái)掛起吃既,用fg命令可以重新切回到前臺(tái);按下Ctrl-C表示終止該進(jìn)程跨细。)
這里還有一個(gè)梗鹦倚,為什么按回車鍵即正常退出,而不拋出EOF異臣讲眩或其他任何異常震叙?掀鹅??
為教材的舉例增加一些調(diào)試代碼
#coding:utf-8
cities = {'CA':'San Francisco', 'MI':'Detroit', 'FL':'Jacksonville'}
cities['NY'] = 'New York'
cities['OR'] = 'Portland'
def find_city(themap, state):
if state in themap:
return themap[state]
else:
return "Not Found"
cities['_find'] = find_city #關(guān)聯(lián)一個(gè)函數(shù)地址到字典中
while True:
print "State? (Enter to quit)",
state = raw_input("> ")
print state #打印輸入的字符串
print len(state) #計(jì)算輸入字符串長(zhǎng)度
print bool(state) #判斷輸入的真值True or False
if not state: break
city_found = cities['_find'](cities, state)
print city_found
增加了按下回車鍵時(shí)媒楼,輸出一些輔助信息
從下面的鏈接中得知乐尊,linux系統(tǒng)中按下回車鍵相當(dāng)于輸入了'\n'實(shí)現(xiàn)回車換行操作。
而raw_input函數(shù)讀入標(biāo)準(zhǔn)輸入時(shí)是抹掉換行符的划址,所以按下回車鍵被刪掉換行符后扔嵌,raw_input的返回為空
執(zhí)行程序,按下回車鍵夺颤,看打印信息
damao@damao:~/Desktop$ python t.py
State? (Enter to quit) >0
False
damao@damao:~/Desktop$
可以看到字符串長(zhǎng)度為0痢缎,真值測(cè)試為假
上述輸出的換行效果是print函數(shù)產(chǎn)生的,若去掉打印代碼世澜,直接按下回車鍵后独旷,輸出信息
damao@damao:~/Desktop$ python t.py
State? (Enter to quit) >
damao@damao:~/Desktop$
因此,按下回車鍵時(shí)沒有拋出異常寥裂。