第四關(guān) 第四關(guān)課后習(xí)題都是列表和字典的數(shù)據(jù)提取相關(guān) 主要對(duì)于列表偏移量,字典鍵值對(duì)的知識(shí)鞏固 做這類題目的時(shí)候,我們不用一次到位,可以把每一層拆分出來(lái),一步步去取值 先看第一個(gè)題目 list1 = [{‘嫉妒’:’envy’},{‘恨’:’hatred’},{‘愛(ài)’:’love’}] 這里是一個(gè)大列表,套三個(gè)字典 題目要求我們把 love 取出來(lái) 因?yàn)?love 在列表的第三個(gè)元素中,所以第一步,我們可以取出列表中的第三個(gè)元素(list1[2]),第三個(gè)元素的偏移量為2 取出來(lái)的結(jié)果是 {‘愛(ài)’:’love’} 接下來(lái)我們可以用提取字典的值的格式,取出list1[2]中鍵’愛(ài)’所對(duì)應(yīng)的值,即’love’ 最后將取出的結(jié)果打印出來(lái),print(list1[2][‘愛(ài)’]) 第二題,同樣要把love取出來(lái),但這里的是字典套列表的一個(gè)變量dict1 = {1:[‘cake’,’scone’,’puff’],2:[‘London’,’Bristol’,’Bath’],3:[‘love’,’hatred’,’envy’]} love 在字典的鍵 3 的值里面,所以第一步,先把 鍵為3 的值取出來(lái) dict1[3] 注意上面這里的3不是偏移量,而是字典的鍵 取出后結(jié)果為[‘love’,’hatred’,’envy’],是一個(gè)列表, love 是該列表的第一個(gè)元素 可以直接通過(guò)偏移量取出,并打印出來(lái) print(dict1[3][0]) 列表第一個(gè)元素的偏移量為0 來(lái)看個(gè)升級(jí)版的,進(jìn)階練習(xí) 
這樣一個(gè)列表,很復(fù)雜,看著就頭暈,那我們可以先把各個(gè)元素的距離稍微拉開(kāi)一點(diǎn),這樣看著比較舒服 
可以看到,在最大的列表中,套著6個(gè)元素 題目要求我們?nèi)〕觥袄恰?,那我們?shù)一下,“狼”在大列表的第6個(gè)元素內(nèi) 
第一步,townee[5] 取出后又是一個(gè)列表,[ {‘主角’:’小紅帽’, ‘配角1’:’外婆’, ‘配角2’:’獵人’}, {‘反面角色’:’狼’} ] ,則可以根據(jù)偏移量再取一遍,townee[5][1] 取到最后是一個(gè)字典 {‘反面角色’:’狼’},在根據(jù)鍵’反面角色’把值取出來(lái)即可 print(townee[5][1][‘反面角色’]) 大家可以多試一下,去取出不同的值 多練才會(huì)熟悉熟練,這樣才會(huì)進(jìn)步 正所謂“好記性不如爛筆頭”,學(xué)編程自然也離不開(kāi)多實(shí)操寫代碼。 編程大神最開(kāi)始也是在bug中成長(zhǎng)的,第一次有問(wèn)題,自己去搜索解決,沒(méi)解決的再提問(wèn),遇到的問(wèn)題多了,搜索次數(shù)多了,自然印象就加深了。 第五關(guān): 第五關(guān)的必做練習(xí),比較簡(jiǎn)單,我講快一點(diǎn)。然后再仔細(xì)講一下進(jìn)階練習(xí) 必做練習(xí)里,簡(jiǎn)化一下題目的要求,其實(shí)就是:打印數(shù)字1到7,但不打印4 既然要打印多個(gè)數(shù)字,那我們用到循環(huán)的方式,for 循環(huán) 和 while 循環(huán) 都可以 那要求不打印4,就需要進(jìn)行一個(gè)條件的判斷,用到if語(yǔ)句 那我們就確定了解題的思路,循環(huán) 條件判斷 先來(lái)看for循環(huán)的代碼 
for num in range(1,8): num的值分別為1,2,3,4,5,6,7 if num != 4: print(num) !=是不等于的意思,當(dāng)num不等于4的時(shí)候,執(zhí)行打印語(yǔ)句 當(dāng)num等于4的時(shí)候,由于不符合if的條件,也沒(méi)有其他語(yǔ)句需要執(zhí)行,所以會(huì)直接跳過(guò),進(jìn)行下一次的循環(huán) 再來(lái)看一下while 循環(huán) 
用while循環(huán),且要規(guī)定循環(huán)次數(shù)的時(shí)候,我們需要提前定義一個(gè)變量n,用來(lái)限制循環(huán)的次數(shù) 這里我們定義了n=0,其實(shí)也可以n=1,但是后面要調(diào)整循環(huán)的放行條件,同學(xué)們完成練習(xí)的時(shí)候可以自己去試 while n < 7: 當(dāng)n滿足小于7的時(shí)候,進(jìn)入循環(huán) n = n 1,因?yàn)槲覀円獜?開(kāi)始打印,而n的初始值是0,所以先加1 if n != 4: # 當(dāng)num != 4,執(zhí)行打印語(yǔ)句;等于4時(shí)不打印。 print(n) 同理,判斷n的值是否為4 必做練習(xí)講完了,我們繼續(xù)講講進(jìn)階練習(xí) 那我繼續(xù)講階練習(xí)的講解啦 進(jìn)階練習(xí)是一個(gè)換座位的題目,大家看到這個(gè)題目的時(shí)候,先不從程序的角度去想,會(huì)覺(jué)得應(yīng)該怎么去實(shí)現(xiàn)輪換位置這個(gè)效果呢? 
我們正常的輪換座位,就是要實(shí)現(xiàn)123,231,312這樣的輪換 那回到代碼中,students = [‘小明’,’小紅’,’小剛’] 是一個(gè)列表,我們需要把第一個(gè)元素提取出來(lái),再重新寫入到這個(gè)列表最后 student1 = students[0],我們把偏移量為0,也就是第一個(gè)元素取出,暫時(shí)賦值給一個(gè)變量 然后,students = students[1:] 把原有的列表進(jìn)行切片,只保留后兩個(gè)元素 切片是第四關(guān)的知識(shí)哦,在這里就運(yùn)用到了 最后,students.append(student1) 我們?cè)侔裺tudent1重新寫入students這個(gè)列表里 append()也是第四關(guān)的知識(shí)哦,只對(duì)列表才可以這么用 最后,因?yàn)檫@個(gè)座位的輪換要重復(fù)三次,因?yàn)橛腥齻€(gè)同學(xué),所以我們需要把上面的操作重復(fù)三遍 這時(shí)候就要用到:循環(huán) 
上面是for循環(huán)的用法 下面是while循環(huán)的用法 
因?yàn)橛幸?guī)定循環(huán)次數(shù),所以同樣需要先定義一個(gè)變量,用來(lái)控制循環(huán)的次數(shù) 其他都是一樣的 第六關(guān) 囚徒困境有普通版和升級(jí)版,但是代碼部分有重疊,那我就直接講升級(jí)版的吧 首先看到這個(gè)題目,我們要想一下,這個(gè)囚徒困境,讓兩個(gè)人分別做兩種選擇,那么一共會(huì)出現(xiàn)4種情況 兩個(gè)人都認(rèn)罪、兩個(gè)人都不認(rèn)罪、A認(rèn)B不認(rèn)、A不認(rèn)B認(rèn) 對(duì)于這四個(gè)情況,我們大概有想法了,可以用四個(gè)條件語(yǔ)句去執(zhí)行不同的操作 
這一個(gè)我覺(jué)得應(yīng)該理解難度不大吧 不過(guò)這要注意一個(gè)細(xì)節(jié)的東西 
在升級(jí)版的題目中,有以下要求 
所以在代碼中 
n 是用來(lái)記錄循環(huán)的次數(shù)的,在題目中,n 是用來(lái)統(tǒng)計(jì)一共多少對(duì)實(shí)驗(yàn)者(一次循環(huán)為一對(duì)); list_answer=[] 是用來(lái)存放實(shí)驗(yàn)者選擇的一個(gè)空列表 看回程序,n = 1用來(lái)記錄循環(huán)的次數(shù),也就是記錄了達(dá)到最優(yōu)解的時(shí)候,一共有多少對(duì)實(shí)驗(yàn)者 
每次A和B做了選擇后,將兩人的選擇以小列表的方式 [a,b],再寫入大列表中 直到循環(huán)結(jié)束后,我們用 print(‘第’ str(n) ‘對(duì)實(shí)驗(yàn)者選了最優(yōu)解?!? 就可以打印出一共有多少對(duì)實(shí)驗(yàn)者了 最后一部分,我們需要把每個(gè)實(shí)驗(yàn)者的選擇打印出來(lái) 既然是重復(fù)性的一些操作,那我們又需要用到循環(huán) 我們用 i 是用來(lái)遍歷n的,也就是遍歷每一對(duì)實(shí)驗(yàn)者; 問(wèn)題:str(i 1) 是什么意思? i 遍歷的是時(shí)候是從0開(kāi)始的,要打印第幾對(duì)實(shí)驗(yàn)者時(shí),因?yàn)椴荒苷f(shuō)說(shuō)第0對(duì)實(shí)驗(yàn)者,所以就需要把 n 1,str()是轉(zhuǎn)換數(shù)據(jù)類型; 問(wèn)題:list_answer[i] 是什么意思? list_answer是用來(lái)存放實(shí)驗(yàn)者選擇的一個(gè)列表,所以 list_answer[i] 就是通過(guò)偏移量將列表的元素取出來(lái) 
在最后一個(gè)練習(xí)中 movies是一個(gè)字典,而字典的值是表格,用來(lái)存放演員的名字 首先我們用 actor = input(‘你想查詢哪個(gè)演員?’),去輸入查詢的演員名字 然后我們用 for movie in movies: # 用 for 遍歷字典,這里遍歷出來(lái)的movie,是字典的鍵,這個(gè)跟昨天學(xué)習(xí)循環(huán)的一個(gè)習(xí)題類似 然后使用 actors = movies[movie] # 讀取各個(gè)字典的主演表 同樣,movies[movie]是取出字典的值的固定格式 到這一步為止,我們就把字典的值,也就是存放演員的列表取出來(lái)了,我們可以通過(guò) print(actors)去看看 由于actors是一個(gè)列表,那么我們要判斷前面輸入的actor,是否“在”列表里面呢 所以我們用 if actor in actors:,可以理解為 如果 要查詢的actor 在 演員列表actors 里 如果actor在,那么就匹配上了,我們就可以把print(actor ‘出演了電影’ movie),演員名字跟對(duì)應(yīng)的電影名字連接起來(lái),打印出來(lái) 第六關(guān)的練習(xí)也講解完成了哦,要記得學(xué)習(xí)呀??
|