python全棧開發-第五天 python_day_5
今日大綱:
1. dict 用大括號{} 括起來. 內部使用key:value的形式來儲存資料 {'jay':'周杰倫', "jj":'林俊杰'} 注意:字典的key必須是可雜湊的. 不可變的, value 沒有限制 不是按照我們儲存的順序儲存的, 無序的 2. 增刪改查
- dict[不存在的key] = value, setdefault()
- pop(key). del dict[key]. popitem(), clear()
- dict[存在的key] = 新值, d1.update(d2) 把d2的k-v更新到d1中
- get(key, 預設值), setdefault(), dict[key]
3. 字典的常用方法
- keys() 返回所有字典的key的集合(高仿列表)
- values() 返回所有的value的集合
- items() 返回鍵值對. 元組
解構: a, b = (1, 2)
4. 字典的巢狀
05. 萬惡之源-基本資料型別(dict) 本節主要內容:
- 字典的簡單介紹
- 字典增刪改查和其他操作
- 字典的巢狀
⼀. 字典的簡單介紹 字典(dict)是python中唯⼀的⼀個對映型別.他是以{ }括起來的鍵值對組成. 在dict中key是 唯⼀的. 在儲存的時候, 根據key來計算出⼀個記憶體地址. 然後將key-value儲存在這個地址中. 這種演算法被稱為hash演算法, 所以, 切記, 在dict中儲存的key-value中的key'必須是可hash的, 如果你搞不懂什麼是可雜湊, 暫時可以這樣記, 可以改變的都是不可雜湊的, 那麼可雜湊就意味著不可變. 這個是為了能準確的計算記憶體地址⽽規定的. 已知的可雜湊(不可變)的資料型別: int, str, tuple, bool 不可雜湊(可變)的資料型別: list, dict, set 語法 : {key1: value1, key2: value2....} 注意: key必須是不可變(可雜湊)的. value沒有要求.可以儲存任意型別的資料
dic = {'jay':"周杰倫", "jj":"林俊杰", "eason":"陳奕迅"} print(dic) dic = {1: "馬化騰", False:"阿里巴巴", "sylar":"帥的不行不行的", (1, "哈哈"): "元組", ["吼吼"]:"列表"} print(dic)
dict儲存的資料不是按照我們新增進去的順序儲存的. 是按照hash表的順序儲存的. ⽽hash表 不是連續的. 所以不能進⾏切片⼯作. 它只能通過key來獲取dict中的資料 ⼆. 字典的增刪改查和其他相關操作
1. 增加
# 字典的相關操作 # 增加 dict = {"name":"corn","age":21,"sex":"男","hobby":"pplay game","money":1000} dict["sex"] = "男" # 增加 如果key重複了. 會替換掉原來的value dict.setdefault("hobby","play game") # 如果字典中已經包含了這個key. 不再繼續儲存
2. 刪除
#pop dic = {"牌牌":"你去哪裡了", "曉雪":"你快回來.", "雪雪": "又走了"} ret = dic.pop("曉雪") # 刪除一個元素. 返回這個元素的value值 print(ret) del dic["雪雪"] #del ret = dic.popitem() # 返回給你的是一個元組. print(ret) print(dic)
3. 修改
#1 dic = {"id":1, 'name':'李嘉誠', 'money':10000000} # 李嘉誠賠了500 dic['money'] = dic['money'] - 500 # 用key去修改 print(dic) #2 dic1 = {"李晨":"范冰冰", "鄧超":"孫儷", "王祖藍":"李亞男"} dic2 = {"李晨":"張馨予", "鄭凱":"baby", "王寶強":"馬蓉"} dic1.update(dic2) # 把dic2中的內容更新到 dic1 , 如果存在了key. 替換. 如果不存在,新增 print(dic1) print(dic2)
4. 查詢 *查詢⼀般⽤key來查詢具體的資料
#1 dic = {"及時雨":"宋江", "小李廣":"花榮", "黑旋風":"李逵", "易大師":"劍聖"} dic["大寶劍"] = "蓋倫" # 新增 dic["及時雨"] = "天老爺" # 修改 print(dic["易大師是個腦殘"]) # 查詢, 如果key不存在,報錯 print(dic.get("易大師", "餘小C")) # 如果key不存在. 返回None get() #可以通過key來獲取value的值. 那麼如果key不存在. 返回None. #可以給出一個預設值. 當key不存在的時候返回預設值 #2 dic = {"及時雨":"宋江", "易大師":"劍聖"} dic.setdefault("及時雨", "諾克薩斯") # 可以幫我們新增 print(dic) ret = dic.setdefault("及時雨123", "hello") print(ret) print(dic) #3 #1. 首先判斷原來的字典中有沒有這個key . 如果沒有. 執行新增 #2. 用這個key去字典中查詢, 返回查到的結果 dic = {"及時雨":"宋江", "易大師":"劍聖"} ret = dic.setdefault("及時雨", "西門慶") print(dic) print(ret)
5. 其他相關操作
#1 dic = {"及時雨":"宋江", "易大師":"劍聖", "維恩":"暗影獵手"} print(dic.keys()) # 拿到所有的key, 返回key的集合. 像是列表. 但是不是列表 for key in dic.keys(): # 可以進行迭代迴圈 print(key) print(dic.values()) for value in dic.values(): print(value) #2 dic = {"及時雨":"宋江", "易大師":"劍聖", "維恩":"暗影獵手"} print(dic.items()) # 拿到鍵值對 # 遍歷dict for k, v in dic.items(): print(k , v) for k, v in dic.items(): # = item # (key, value) # print(item) # (key, value) print(k,v) # 解構 . 解包 a, b = (1, 2) print(a) print(b) a, b, c = ("馬化騰", "馬雲", "馬良") print(b) a, b = [1, 2] print(a, b)
三. 字典的巢狀.
dic = { "name":"汪峰", "age": 58, "wife":{ "name":"國際章", "salary": 180000, "age": 37 }, "children":[ {"name":"老大", "age": 18}, {"name":"老二", "age": 118} ] } print(dic["children"][1]["age"]) print(dic["wife"]['salary'])
四.字典的for迴圈.
dic = {1: 'a', 2:'b', 3:'c'} for a in dic: # 直接迴圈字典.拿到的是key print(a) print(dic[a])
作業:
一,有如下變數(tu是個元祖),請實現要求的功能
tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11, 22, 33)}, 44]) #a.講述元組的特性 #元組:不可變的列表.⼜被成為只讀列表 # b. 請問tu變數中的第一個元素 "alex" 是否可被修改? #不可以 # c. 請問tu變數中的"k2"對應的值是什麼型別?是否可以被修改?如果可以,請在其中新增一個元素 "Seven" #列表 可以被修改 tu[1][2]["k2"].append("Seven") print(tu) # d. 請問tu變數中的"k3"對應的值是什麼型別?是否可以被修改?如果可以,請在其中新增一個元素 "Seven" #元組 不可以被修改
二, 字典dic, dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]}
dic = {'k1': "v1", "k2": "v2", "k3": [11, 22, 33]} # a.請迴圈輸出所有的key print(dic.keys()) # b.請迴圈輸出所有的value print(dic.values()) # c.請迴圈輸出所有的key和value for a,b in dic.items(): print(a,b) # d.請在字典中新增一個鍵值對,"k4": "v4",輸出新增後的字典 dic["k4"] = "v4" print(dic) # e.請在修改字典中"k1"對應的值為"alex",輸出修改後的字典 dic["k1"] = "alex" print(dic) # f.請在k3對應的值中追加一個元素44,輸出修改後的字典 dic["k3"].append(44) print(dic) # g.請在k3對應的值的第1個位置插入個元素18,輸出修改後的字典 dic["k3"].insert(1,18) print(dic)
三.
av_catalog = { "歐美":{ "www.youporn.com": ["很多免費的,世界最大的","質量一般"], "www.pornhub.com": ["很多免費的,也很大","質量比yourporn高點"], "letmedothistoyou.com": ["多是自拍,高質量圖片很多","資源不多,更新慢"], "x-art.com":["質量很高,真的很高","全部收費,屌絲請繞過"] }, "日韓":{ "tokyo-hot":["質量怎樣不清楚,個人已經不喜歡日韓範了","verygood"] }, "大陸":{ "1024":["全部免費,真好,好人一生平安","伺服器在國外,慢"] } } # a,給此 ["很多免費的,世界最大的","質量一般"]列表第二個位置插入一個元素:'量很大'。 av_catalog["歐美"]["www.youporn.com"].insert(2,"量很大") print(av_catalog) # b,將此 ["質量很高,真的很高","全部收費,屌絲請繞過"]列表的 "全部收費,屌絲請繞過" 刪除。 av_catalog["歐美"]["x-art.com"].remove("全部收費,屌絲請繞過") print(av_catalog) # c,在此 ["質量很高,真的很高","全部收費,屌絲請繞過"]列表中新增"金老闆最喜歡這個"。 av_catalog["歐美"]["x-art.com"].append("金老闆最喜歡這個") print(av_catalog) # d,將此["質量怎樣不清楚,個人已經不喜歡日韓範了","verygood"]列表的 "verygood"全部變成大寫。 av_catalog["日韓"]["tokyo-hot"][1] = av_catalog["日韓"]["tokyo-hot"][1].upper() print(av_catalog) # e,給'大陸' 對應的字典新增一個鍵值對 '1048' :['一天就封了'] av_catalog["大陸"]["1024"] = "一天就封了" print(av_catalog) # f,刪除此"letmedothistoyou.com": ["多是自拍,高質量圖片很多","資源不多,更新慢"]鍵值對。 a = av_catalog["歐美"].pop("letmedothistoyou.com") print(av_catalog) # g,給此["全部免費,真好,好人一生平安","伺服器在國外,慢"]列表的第一個元素,加上一句話:'可以爬下來' av_catalog["大陸"]["1024"].insert(1,"可以爬下來") print(av_catalog)
四、有字串 "k:1|k1:2|k2:3|k3:4" 處理成字典 {'k':1,'k1':2....} (升級題)
s = "k:1|k1:2|k2:3|k3:4" dic = {} count = 0 s1 = s.split("|") while count <= 3: s1[count] = s1[count].split(":") count += 1 for i in s1: dic[i[0]] = int(i[1]) print(dic)
五、元素分類
有如下值li= [11,22,33,44,55,66,77,88,99,90],將所有大於 66 的值儲存至字典的第一個key中,將 小於 66 的值儲存至第二個key的值中。即: {'k1': 大於66的所有值列表, 'k2': 小於66的所有值列表}
li= [11,22,33,44,55,66,77,88,99,90] l = [] l1 = [] dict = {} for i in li: if int(i) > 66: l.append(i) elif int(i) < 66: l1.append(i) dict["k1"] = l dict["k2"] = l1 print(dict
六、輸出商品列表,使用者輸入序號,顯示使用者選中的商品(升級題)
# 商品列表: goods = [{"name": "電腦", "price": 1999}, {"name": "滑鼠", "price": 10}, {"name": "遊艇", "price": 20}, {"name": "美女", "price": 998}, ] # 要求: # 1:頁面顯示序號 + 商品名稱 + 商品價格,如: #1 電腦 1999 #2 滑鼠 10 # … a = 0 count = 1 dic = {} while count < 5: print("%s %s %s" % (count,goods[a]["name"],goods[a]["price"])) dic[count] = goods[a] count += 1 a += 1 # 2:使用者輸入選擇的商品序號,然後列印商品名稱及商品價格 while 1: s = input("請你輸入選擇的商品的序號:") print("%s %s" % (dic[int(s)]["name"],dic[int(s)]["price"])) # 3:如果使用者輸入的商品序號有誤,則提示輸入有誤,並重新輸入。 while 1: s = input("請你輸入選擇的商品的序號:") if int(s) > int(4): print("輸入有誤,請重新輸入") else: print("%s %s" % (dic[int(s)]["name"],dic[int(s)]["price"])) # 4:使用者輸入Q或者q,退出程式。 while 1: s = input("請你輸入選擇的商品的序號(按Q退出程式):") if s.upper() == "Q": break elif int(s) > int(4): print("輸入有誤,請重新輸入") else: print("%s %s" % (dic[int(s)]["name"],dic[int(s)]["price"]))