本章知識點(diǎn) :> 字典
- 復(fù)習(xí)一下
p0總結(jié)在線看
p1總結(jié)在線看
p4總結(jié)在線看
p5總結(jié)在線看
- 本章介紹的是
字典
,字典
也是一種組合數(shù)據(jù)類型碎紊,跟列表只有一個(gè)不同點(diǎn)(幾乎就是孿生兄弟) - 現(xiàn)在我們一邊復(fù)習(xí)列表的操作,一遍講對應(yīng)的字典操作
字典與列表
假設(shè)現(xiàn)在有一本中英文對照字典,內(nèi)容包括
("你好" - 'hello')
("中國" - 'china')
("生活" - ’life')
("男孩" - ‘boy’)
... ...
這樣的一對對的詞組
思考:用list怎么存儲(chǔ)這個(gè)中英文字典呢封恰?(要考慮后面用中文去查找對應(yīng)的英文)
思路1:用兩個(gè)列表违霞,一個(gè)存儲(chǔ)中文灭抑,一個(gè)存儲(chǔ)英文(用下標(biāo)1-1對應(yīng))
list1 = ["你好","中國","生活","男孩"]
list2 = ['hello','china',’life',‘boy’]
思路2:用一個(gè)列表檩淋,每一個(gè)元素還是一個(gè)列表(存儲(chǔ)中英文對)
list = [
["你好" , 'hello'],
["中國" , 'china'],
["生活" , ’life'],
["男孩" , ‘boy’]
]
直接用列表來存儲(chǔ)這個(gè)字典,都無法直接通過中文找到英文(需要先找到下標(biāo)在讶,再找到英文)
字典
(Python里的字典類型)則可以直接通過中文找到英文看一下:
d = {
"你好" : 'hello',
"中國" : 'china',
"生活" : ’life',
"男孩" : ‘boy’
}
d["中國"] #結(jié)果為hello
試一下 在線Python
-
語法是這樣的:
易錯(cuò)點(diǎn):用
[ ]
表示列表
煞抬; 用{}
表示字典
易錯(cuò)點(diǎn):關(guān)鍵是理解
鍵
, 在列表里,用0,1,2,3
來表示變量的位置(還記得嗎)构哺;在字典
里革答,用“中國” , 1, "abc"
來表示變量的key
(也就是鍵
)在列表里這樣訪問數(shù)據(jù),
list[1] list[0]
字典里d["a"] d["中國"]
易錯(cuò)點(diǎn):在列表里的變量可以是不同類型;字典里也一樣
d = {
"a" : [1,2,3],
"b" : True
}
試一下 在線Python
字典訪問
- 列表訪問
list1 = ["你好","中國","生活","男孩"]
list2 = ['hello','china',’life',‘boy’]
i = list.index('中國')
list2[i] #結(jié)果為hello
- 字典訪問
d = {
"你好" : 'hello',
"中國" : 'china',
"生活" : ’life',
"男孩" : ‘boy’
}
d["中國"] #結(jié)果為hello
試一下 在線Python
字典函數(shù)
如何判斷一個(gè)元素在列表里
list1 = ["你好","中國","生活","男孩"]
list2 = ['hello','china',’life',‘boy’]
i = list.index('中國')
if i >=0:
????print("在")
試一下 在線Python如何判斷一個(gè)元素在字典里
d = {
"你好" : 'hello',
"中國" : 'china',
"生活" : ’life',
"男孩" : ‘boy’
}
if ‘中國' in d:
????print("在")
試一下 在線Python易錯(cuò)點(diǎn):在字典的判斷曙强,直接用
x in dict
的語法即可len函數(shù) 可以用在列表和字典上
d = {
"你好" : 'hello',
"中國" : 'china',
"生活" : ’life',
"男孩" : ‘boy’
}
print(len(d))
試一下 在線Python添加元素(字典更加方便), 比如:添加一對單詞
('女孩' - 'girl')
d['女孩'] = 'girl'
print(d)
試一下 在線Pythondel 可以用于列表和字典的刪除元素
del d['男孩']
print(d)
試一下 在線Python
for 循環(huán)
list = [1,2,3,4,5]
for i in list:
????print(i)
試一下 在線Python
- 這是一個(gè)列表遍歷算法
- 字典的遍歷非常類似
d = {
"你好" : 'hello',
"中國" : 'china',
"生活" : ’life',
"男孩" : ‘boy’
}
for ch,en in d.items():
????print(ch + '-->' + en)
試一下 在線Python
- 注意用
d.items()
函數(shù)取出所有鍵-值
對 - 沒有辦法,
列表
和字典
就是這么形影不離残拐,如果我們可以對照著理解,就會(huì)特別好記碟嘴!
單詞計(jì)數(shù)
- 現(xiàn)在看一個(gè)實(shí)際問題溪食,我們也理一理思路
- 經(jīng)典的單詞計(jì)數(shù)問題,現(xiàn)在有一篇文章娜扇,請你寫一個(gè)Python程序來計(jì)算每一個(gè)單詞的出現(xiàn)次數(shù)(假設(shè)用aa bb來代表單詞)
aa bb aa cc dd
aa bb cc aa ee
ff gg hh
jj ff gg
ee ss
- 思考一下:我們用什么來存儲(chǔ)這篇文章错沃?
- 思考一下:我們用什么存儲(chǔ)計(jì)數(shù)栅组?
list = ['aa', 'bb']
d = {'aa':0, 'bb':0}
- 我分別用list 和 d 來存儲(chǔ)數(shù)據(jù)和計(jì)數(shù)(一個(gè)是列表,一個(gè)是字典)
- 思路:顯然要用循環(huán)
- 重復(fù)的事:遍歷list取每一個(gè)單詞 word
- 在d里面把word對應(yīng)的計(jì)數(shù)+1
- 還考慮寫一個(gè)函數(shù) 取名
wordcount
- 輸入:
list
- 輸出:
d
def wordcount(list):
( 還記得函數(shù)嗎枢析?)
????d = {}
????#..
????return d
- 實(shí)現(xiàn)如下:
list = ['aa' , 'bb' ,'aa' ,'cc' ,'dd',
'aa' ,'bb' ,'cc', 'aa', 'ee',
'ff' ,'gg' ,'hh' ,
'jj' ,'ff', 'gg',
'ee' ,'ss']
def wordcount(list):
????d = {}
????for word in list:
????????is_in = word in d
????????if is_in == False:
???????????d[word] = 0
????????d[word] = d[word] + 1
????return d
- 易錯(cuò)點(diǎn):一定要注意用
word in d
來判斷是否存在
試一下 在線Python
綜合運(yùn)用
- 問題:請為地鐵2號線玉掸,編寫問路程序 (要求指出最優(yōu)路線)
- 思路:先取名
環(huán)線最優(yōu)路徑算法
- 輸入:
start
end
輸出fangxiang
zou_num
-
代碼塊
定義成函數(shù):
def huanxian(start, end):
????fangxiang = ''
????zou_num = 0
????#待實(shí)現(xiàn)
????return (fangxiang,zou_num) #可以同時(shí)返回兩個(gè)變量哦~
- 現(xiàn)在考慮用字典存儲(chǔ) 2號線環(huán)形信息。(鍵值對為
當(dāng)前站名-下一站名
) - 比如:
d = {
'前門’ : '崇文門',
'崇文門' : ‘北京站‘
...
}
- 知道了 start 和 end 能不能在字典里找到路徑醒叁?(思考一下)
- 大概的思路:循環(huán)取字典里的值司浪,再將值作為鍵,找到下一站(也就是一站站往后循環(huán))
start = '前門'
next = start
next = d[next]
next = d[next]
試一下 在線Python
思路
- 實(shí)現(xiàn)以下環(huán)線算法
def huanxian(start, end):
????fangxiang = ''
????zou_num = 0
????right_d = {'前門':'崇文門','崇文門’:'北京站'把沼,'北京站':'建國門','建國門’:'朝陽門'啊易,'朝陽門':'東四十條','東四十條’:'東直門','東直門':'雍和宮','雍和宮’:'安定門'饮睬,'安定門':'鼓樓大街','鼓樓大街’:'積水潭'租谈,'積水潭':'西直門','西直門’:'車公莊', '車公莊':'阜成門','阜成門':'復(fù)興門','復(fù)興門':'長椿街','長椿街':'和平門','和平門':'前門'} #右行字典
????left_d = {'崇文門':'前門','北京站':'崇文門’,'建國門':'北京站','朝陽門':'建國門’续捂,'東四十條':'朝陽門','東直門':'東四十條’垦垂,'雍和宮':'東直門','安定門':'雍和宮’,'鼓樓大街':'安定門','積水潭':'鼓樓大街’牙瓢,'西直門':'積水潭','車公莊':'西直門’, '阜成門':'車公莊','復(fù)興門':'阜成門','長椿街':'復(fù)興門','和平門':'長椿街','前門':'和平門'} #左行字典
????#環(huán)線最優(yōu)路徑算法
????next = start
????right_n = 0 #先嘗試右行
????while next != end:
????????next = right_d[next] #下一站
????????right_n = right_n +1 #走了幾站
????next = start
????left_n = 0 #嘗試左行
????while next != end:
????????next = left_d[next] #下一站
????????left_n = left_n +1 #走了幾站
????if right_n < left_n:
????????fangxiang = '右‘
???????? zou_num = right_n
????if left_n < right_n:
????????fangxiang = '左‘
???????? zou_num = left_n
????return (fangxiang, zou_num)
試一下 在線Python
- ”當(dāng)前站回答法"
def say_dangqian():
????print("現(xiàn)在出站")
- "問路回答法"
def huida(fangxiang, zou_num):
????#待實(shí)現(xiàn)
????a = 0
????while a < zou_num:
????????print(fangxiang+'走1站') #一定要4個(gè)空格
????????a = a + 1
- 現(xiàn)在來寫主程序( 特別短,很好讀)
start = '?' #具體執(zhí)行時(shí)填寫
end = '?' #具體執(zhí)行時(shí)填寫
fangxiang = ''
zou_num = 0
if start == end:
????say_dangqian()
(fangxiang,zou_num) = huanxian(start_num, end_num)
huida(fangxiang, zou_num)
下一章會(huì)先復(fù)習(xí) 字典
的知識间校,不用擔(dān)心今天的新知識太多~
p6 知識點(diǎn)總結(jié):
目錄
0基礎(chǔ)教程金哥Python自學(xué)筆記P0~變量與運(yùn)算
0基礎(chǔ)教程金哥Python自學(xué)筆記P1~循環(huán)與控制