005-2018-09-07 字典
阿新 • • 發佈:2018-12-18
1.今日內容大綱
一. 回顧昨日內容 1. 列表的定義: 能裝物件的物件. 由[]表示. 內部使用逗號隔開 索引和切片 . 從0開始 [start: end: step] 2. 增刪改查 1. 新增: append(), insert(), extend()迭代新增 2. 刪除: pop(), remove(), clear(), del 元素 3. 修改: 索引或切片修改 4. 查詢: 索引查詢 for el in list: 5. 操作: count(), index(), find(), sort(reverse=True), reverse() 3. 元組(tuple): 由()表示. 內部用逗號隔開. 不可變, 只讀列表 不可變指的是第一層元素. 不可變的資料型別: int, str, bool, (元組) 4. range() range(10) 0-9 range(1, 12) 1-11 range(1,12, 3) 1 4 7 10 for el in list: # 沒有索引 for i in range(len(list)): list[i] 二. 作業講解 三. 今日主要內容 1. 什麼是字典 dict. 以{}表示. 每一項用逗號隔開, 內部元素用key:value的形式來儲存資料 {"jj":"林俊杰", "jay":"周杰倫"} 查詢的效率非常高, 通過key來查詢元素 內部使用key來計算一個記憶體地址(暫時),hash演算法. key必須是不可變的資料型別(key 必須是可雜湊的資料型別) 可雜湊就是不可變 2. 字典的增刪改查 1. 字典的新增: dict[新key] = value dict.setdefault() 2. 刪除 pop(key) popitem() clear() del dict[key] 3. 修改 dic[key] = 新值 update() 4. 查詢 1. 用key直接查詢 dict[key] 2. get(key, 如果key不存在返回的資料) 3. setdefault() 1. 執行新增流程. 2. 查詢結果 5. 操作 1. keys() 獲取所有鍵 這個返回的不是列表, 很像列表 2. values()獲取所有的值 3. items() 獲取所有的鍵值對. 返回的是元組 解構, 直接把元組或者列表中的資料拿出來. a, b, c = (a1, b1, c1) 必須一一對應 6. 遍歷字典 for key in dict: dict[key] for k, v in dict.items(): k , v 7. 字典巢狀. 預習: 1. == 和 is 的區別(小資料池) 2. 再談編碼(decode(), encode()) 建議: 1. 本週作業過一遍. 大作業 2. 玩兒. 回來之後.預習一下. 大作業
2.練習
''' day4作業及默寫 1,寫程式碼,有如下列表,按照要求實現每⼀個功能 li = ["alex", "WuSir", "ritian", "barry", "wenzhou"] 1)計算列表的⻓度並輸出 2)列表中追加元素"seven",並輸出新增後的列表 3)請在列表的第1個位置插⼊元素"Tony",並輸出新增後的列表 4)請修改列表第2個位置的元素為"Kelly",並輸出修改後的列表 5)請將列表l2=[1,"a",3,4,"heart"]的每⼀個元素新增到列表li中,⼀⾏程式碼實 現,不允許迴圈新增。 6)請將字串s = "qwert"的每⼀個元素新增到列表li中,⼀⾏程式碼實現,不 允許迴圈新增。 7)請刪除列表中的元素"eric",並輸出新增後的列表 8)請刪除列表中的第2個元素,並輸出刪除的元素和刪除元素後的列表 9)請刪除列表中的第2⾄4個元素,並輸出刪除元素後的列表 10)請將列表所有得元素反轉,並輸出反轉後的列表 11)請計算出"alex"元素在列表li中出現的次數,並輸出該次數。 2,寫程式碼,有如下列表,利⽤切⽚實現每⼀個功能 li = [1, 3, 2, "a", 4, "b", 5,"c"] 1)通過對li列表的切⽚形成新的列表l1,l1 = [1,3,2] 2)通過對li列表的切⽚形成新的列表l2,l2 = ["a",4,"b"] 3)通過對li列表的切⽚形成新的列表l3,l3 = ["1,2,4,5] 4)通過對li列表的切⽚形成新的列表l4,l4 = [3,"a","b"] 5)通過對li列表的切⽚形成新的列表l5,l5 = ["c"] 6)通過對li列表的切⽚形成新的列表l6,l6 = ["b","a",3] 3,寫程式碼,有如下列表,按照要求實現每⼀個功能。 lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"] 1)將列表lis中的"tt"變成⼤寫(⽤兩種⽅式)。 2)將列表中的數字3變成字串"100"(⽤兩種⽅式)。 3)將列表中的字串"1"變成數字101(⽤兩種⽅式)。 4,請⽤程式碼實現: li = ["alex", "eric", "rain"] 利⽤下劃線將列表的每⼀個元素拼接成字串"alex_eric_rain" 5.利⽤for迴圈和range打印出下⾯列表的索引。 li = ["alex", "WuSir", "ritian", "barry", "wenzhou"] 6.利⽤for迴圈和range找出100以內所有的偶數並將這些偶數插⼊到⼀個新列表 中。 7.利⽤for迴圈和range 找出50以內能被3整除的數,並將這些數插⼊到⼀個新列 表中。 8.利⽤for迴圈和range從100~1,倒序列印。 9.利⽤for迴圈和range從100~10,倒序將所有的偶數新增到⼀個新列表中,然 後對列表的元素進⾏篩選,將能被4整除的數留下來。 10,利⽤for迴圈和range,將1-30的數字⼀次新增到⼀個列表中,並迴圈這個 列表,將能被3整除的數改成*。 11,查詢列表li中的元素,移除每個元素的空格,並找出以"A"或者"a"開頭,並 以"c"結尾的所有元素,並新增到⼀個新列表中,最後迴圈列印這個新列表。 li = ["TaiBai ", “ale xC", “AbC ", "egon", " ri TiAn", "WuSir", " aqc"] 12,開發敏感詞語過濾程式,提示⽤戶輸⼊評論內容,如果⽤戶輸⼊的內容中 包含特殊的字元: 敏感詞列表 li = ["蒼⽼師", "東京熱", "武藤蘭", "波多野結⾐"] 則將⽤戶輸⼊的內容中的敏感詞彙替換成等⻓度的*(蒼⽼師就替換***),並添 加到⼀個列表中;如果⽤戶輸⼊的內容沒有敏感詞彙,則直接新增到上述的列 表中。 13,有如下列表 li = [1, 3, 4, "alex", [3, 7, 8, "TaiBai"], 5, "RiTiAn"] 迴圈列印列表中的每個元素,遇到列表則再迴圈打印出它⾥⾯的元素。 我想要的結果是: 1 3 4 "alex" 3 7, 8 "taibai" 5 ritian 14. 把班級學⽣數學考試成績錄⼊到⼀個列表中: 並求平均值. 要求: 錄⼊的時候 要帶著⼈名錄⼊, 例如: 張三_44 15. 敲七遊戲. 從0開始數數. 遇到7或者7的倍數要在桌上敲⼀下. 程式設計來完成敲 七 16. (升級題) 編寫程式. 完成⼼動⼥⽣的篩選. (升級題) ⾸先. 程式會提示⽤戶錄⼊10位⼼儀⼥⽣的姓名. 然後把10位⼥⽣的名 字和序號展示出來. 由⽤戶選擇⼼動⼥⽣. 此時⽤戶可以選擇3個⼼動⼥⽣. 把⽤ 戶選中的三個⼼動⼥⽣的名字打印出來. 供⽤戶繼續選擇. 這⼀次選擇. 只能選 擇⼀名⼥⽣. 然後輸出⽤戶的⼼動⼥⽣是xxx 運⾏效果: 明⽇默寫內容 1,將列表的增刪改查不同的⽅法全部寫出來, 例如:增:有三種,append:在後⾯新增。Insert按照索引新增, extend:迭代著新增。 2,默寫第,13題的實現的程式碼。 ''' # li = ["alex", "WuSir", "ritian", "barry", "wenzhou", "eric"] # # l2=[1,"a",3,4,"heart"] # # print(len(li)) # # li.append("seven") # li.extend(l2) # li.remove(li[2]) # li.pop(2) # print(li) # li = [1, 3, 2, "a", 4, "b", 5,"c"] # # ["c"] # print(li[-1:]) # lis = [2, 3, "k", ["qwe", 20, ["k1", ["tt", 3, "1"]], 89], "ab", "adv"] # lis[3][2][1][0] = lis[3][2][1][0].upper() # lis[3][2][1][0] = "TT" # lis[3][2][1][0] = lis[3][2][1][0].replace("t", "T") # lis[3][2][1][0] = lis[3][2][1][0].swapcase() # lis[3][2][1][1] = "100" # lis[3][2][1][1] = str(lis[3][2][1][1] + 97) # lis[3][2][1][2] = int(lis[3][2][1][2] + "01") # lis[3][2][1][2] = 101 # lis[3][2][1][2] = int(lis[3][2][1][2]) + 100 # print(lis) # li = ["alex", "eric", "rain", "劉偉","你很六"] # # 1+2+3+4+5.... # s = "" # for el in li: # el 列表中的每一個字串 # s = s + el + "_" # print(s[:-1]) # # li = ["alex", "WuSir", "ritian", "barry", "wenzhou"] # for i in range(len(li)): # print(i) # lst = [] # for i in range(50): # if i % 3 == 0: # lst.append(i) # # print(lst) # for i in range(100, 0, -1): # print(i) # lst = [] # for i in range(100, 9, -1): # if i % 2 == 0 and i % 4 == 0: # lst.append(i) # print(lst) # lst = [] # for i in range(1, 30): # lst.append(i) # # for i in range(len(lst)): # if lst[i] % 3 == 0: # lst[i] = "*" # print(lst) # 查詢列表li中的元素,移除每個元素的空格,並找出以"A"或者"a"開頭,並 # 以"c"結尾的所有元素,並新增到⼀個新列表中,最後迴圈列印這個新列表。 # li = ["TaiBai ", "ale xC", "AbC ", "egon", " ri TiAn", "WuSir", " aqc"] # # lst = [] # for el in li: # el = el.replace(" ", "") # 去掉空格的 # if el.upper().startswith("A") and el.endswith("c"): # lst.append(el) # print(lst) # 敏感詞列表 li = ["蒼⽼師", "東京熱", "武藤蘭", "波多野結⾐"] # 則將⽤戶輸⼊的內容中的敏感詞彙替換成等⻓度的*(蒼⽼師就替換***),並添 # 加到⼀個列表中;如果⽤戶輸⼊的內容沒有敏感詞彙,則直接新增到上述的列 # 表中。 # li = ["蒼老師", "東京熱", "武藤蘭", "波多野結衣"] # content = input("請開始你的評論:") # for el in li: # if el in content: # content = content.replace(el, "*"*len(el)) # print(content) # print(list) # print(type([])) # li = [1, 3, 4, "alex", [3, 7, 8, "TaiBai"], 5, "RiTiAn", [3, 7, 8, "TaiBai"]] # for el in li: # if type(el) == list: # for el2 in el: # if type(el2) == str: # print(el2.lower()) # else: # print(el2) # else: # if type(el) == str: # print(el.lower()) # else: # print(el) # for i in range(len(li)): # if i != 4: # print(li[i]) # else: # 第四個是列表. 繼續迴圈 # for el in li[4]: # print(el) # lst = [] # while 1: # info = input("請輸入學生資訊(Q退出):") # 張三_44 # if info.upper() == "Q": # break # lst.append(info) # sum = 0 # for el in lst: # 張三_44 # sum += int(el.split("_")[1]) # # print(sum/len(lst)) # 敲七 # n = int(input("請輸入數字n:")) # lst = [] # for i in range(1, n+1): # if i % 7 == 0 or "7" in str(i): # lst.append("咣") # else: # lst.append(i) # print(lst)
3.字典
dic = {"jj":"林俊杰", "jay":"周杰倫","tz":"陶喆", 1:"哈哈", (1,2,3):"胡辣湯"} # unhashable type: 'list'
print(dic)
4.字典的新增
# dic = {} # # 徐崢:人在囧途 # dic['徐崢'] = "人在囧途" # 直接用key往裡面存資料即可 # dic['黃渤'] = "瘋狂的石頭" # dic["王寶強"] = "天下無賊" # dic["王寶強"] = "士兵突擊" # 如果key已經存在。 那麼會替換掉原來的value, 修改 # # dic.setdefault("黃秋生") # dic.setdefault("黃秋生", "無間道") # 如果存在了key, 不會執行新增 # # print(dic)
5.字典的刪除
dic = {"黃日華": "天龍八部", "呂頌賢": "笑傲江湖", "蘇有朋": "倚天屠龍記", "六小齡童": "西遊記"}
# dic.pop("呂頌賢") # 指定key刪除
# dic.popitem() # 隨機刪除
# del dic["黃日華"] # 刪除
# dic.clear() # 清空字典
print(dic)
6.字典的修改和查詢
dic = {"劉能": "王小利", "趙四": "劉曉光", "王木生": "範偉", "謝大腳": "於月仙", "李大國": "小鬼"}
# dic['王木生'] = "劉偉"
dic2 = {"劉能": "大陽哥", "趙四": "github", "王木生": "汪峰", "謝大腳": "馮提莫", "王大拿": "金老闆"}
dic.update(dic2)
print(dic)
# 查詢
dic = {'劉能': '大陽哥', '趙四': 'github', '王木生': '汪峰', '謝大腳': '馮提莫', '李大國': '小鬼', '王大拿': '金老闆'}
# 1. 最直觀。 直接用key
print(dic['周杰倫']) # 當這個key不存在的時候會報錯
# 2. get方法
print(dic.get("謝大腳", "周杰倫不在這裡")) # 沒有key. 返回None
# 3. setdefault() 1. 新增(先看有沒有key, 如果有就過, 如果沒有,執行新增) 2.根據key把值返回
dic = {}
dic["蓋倫"] = "德瑪西亞之力"
value = dic.setdefault("菲奧娜", "無雙劍姬") # 新增
value2 = dic.setdefault("蓋倫", "劉偉") # 由於已經存在了key。 所以新增不執行。 直接查詢結果
value3 = dic.setdefault("薇恩", "坑")
print(value3)
print(dic)
7.字典的相關操作
dic = {"汪峰": "大陸音樂半壁江山", "周杰倫": "亞洲音樂天王", "羅志祥": "亞洲舞王"}
# 對字典的遍歷
# print(dic.keys()) # dict_keys(['汪峰', '周杰倫', '羅志祥']) 像列表但不是列表
# for key in dic.keys():
# print(key) # 拿到key
# print(dic[key]) # 拿到value
# print(dic.values())
# for value in dic.values():
# print(value)
# 也可以遍歷字典
# [('汪峰', '大陸音樂半壁江山'), ('周杰倫', '亞洲音樂天王'), ('羅志祥', '亞洲舞王')]
# print(dic.items()) # 拿到的是key和value
for k, v in dic.items(): # 當需要遍歷字典. 在操作中涉及到key和value的時候.
print(k) # 元組
print(v)
# 字典本身是一個可迭代物件,可以直接進行for迴圈
for el in dic: # 直接拿到key
print(el)
print(dic[el])
# 前面的變數的個數和後面解包的個數一致
# a, b = (10, 20) # 解構, 解包
# print(a)
# print(b)
8.字典的巢狀
wf = {
"name": "汪峰",
"age": 48,
"成名曲": "春天裡",
"wife": {
"name": "章子怡",
"age": 39,
"工作": "演員"
},
"children":[
{"num": "001", "name": "汪一", "hobby": "唱歌"},
{"num": "002", "name": "汪二", "hobby": "演戲"} # wf['children'][1]['name']
]
}
# wf['wife']['age'] = wf['wife']['age'] + 10
# print(wf)
9.其他
# 建立並輸出選單, 選單是不可變的. 所以使用元組
# menus = ("1, 錄入", "2, 查詢", "3, 刪除", "4, 修改", "5, 退出")
#
# 儲存使用者的資訊 id: {'name':'名字', 'weight':體重, 'height':身高}
# 例如:目前有兩個使用者資訊:1. 汪峰, 2. 章子怡
# 推薦儲存結構:
# bodies = {
# 1:{'name':'汪峰', 'weight':80, 'height':1.8, 'BMI':24.7},
# 2:{'name':'章子怡', 'weight':50, 'height':1.65, 'BMI':18.4}
# }
# bodies = {}
#
# body_id = 1 # 編號從1開始
#
# 體質指數(BMI)= 體重(kg)÷ (身高(m) x 身高(m))
# 體重的單位: KG
# 身高的單位: m
# 需求:
# 首先。列印選單,然後使用者輸入選擇的選單項
# 輸入1:進入錄入環節。使用者需要錄入:名字,身高,體重.
# 由程式計算出BMI指數. 儲存到bodies字典中. 第一個使用者的id是1, 第二個是2, 以此類推
# 錄入完畢後. 提示使用者是否繼續錄入. 如果選擇是, 則繼續進行錄入, 直到使用者輸入否. 則返回到主選單
# 輸入2: 進入查詢環節, 提示使用者輸入要查詢的人的id. 如果不存在,給與提示, 如果存在. 則顯示出該使用者的全部資訊(名字,身高,體重,BMI)
# 然後提示使用者是否繼續查詢. 如果選擇是, 繼續進行查詢, 直到使用者輸入否, 返回主選單
# 輸入3: 進入刪除環節, 提示使用者輸入要刪除的人的id, 如果id不存在, 給與提示, 如果存在, 則執行刪除操作. 並提示刪除成功.
# 然後提示使用者是否繼續刪除, 如果是, 繼續讓使用者選擇要刪除的id, 直到使用者輸入否, 返回主選單
# 輸入4: 進入修改環節, 首先讓使用者輸入要修改的人的id, 根據id查詢使用者資訊, 如果不存在, 給與提示, 如果存在, 將使用者原資訊進行列印,
# 然後提示使用者輸入新的名字, 身高, 體重. 由程式重新計算BMI指數. 並將新的資訊儲存在bodies中. 同時給使用者展示新的使用者資訊
# 然後提示使用者是否繼續修改, 如果是, 則繼續要求使用者輸入id資訊. 直到使用者輸入否, 返回主選單.
# 輸入5: 程式退出.
#
# 輸入其他任何內容. 都予以提示不合法. 讓使用者重新進行輸入
while 1:
print("- - - - - - - - - - - 此處是選單 - - - - - - - - - - -")
menus = ("1, 錄入", "2, 查詢", "3, 刪除", "4, 修改", "5, 退出")
print(menus)
print("- - - - - - - - - - - 此處是選單 - - - - - - - - - - -")
userInputCode = input("請輸入選單序號:")
case = ["1", "2", "3", "4", "5"]
bodies0 = {}
if userInputCode == case[0]:
userId = 1
bodies = {}
while 1:
personBody = {}
userName = personBody["name"] = input("請輸入使用者NAME:")
userWeight = personBody['weight'] = input("請輸入使用者WEIGHT:")
userHeight = personBody['height'] = input("請輸入使用者HEIGHT:")
userBMI = personBody['BMI'] = str(float(userWeight)/((float(userHeight))**2))
print(personBody)
bodies[userId] = personBody
userId += 1
if input("是否繼續錄入(Y/N):").strip().upper() == "Y":
continue
else:
break
# print(bodies)
elif userInputCode == case[1]:
while 1:
el = []
for key in bodies:
el.append(key)
# print(el)
queryId = int(input("請輸入要查詢的使用者ID:").strip())
if queryId in el:
print("資訊如下{}:".format(bodies[queryId]))
else:
print("請從當前列表{}選擇你要查詢的ID資訊".format(el))
continue
if input("是否繼續查詢(Y/N):").strip().upper() == "Y":
continue
else:
break
elif userInputCode == case[2]:
while 1:
el = []
for key in bodies:
el.append(key)
# print(el)
delId = int(input("請輸入要刪除的使用者ID:").strip())
if delId in el:
bodies.pop(delId)
print("刪除成功")
# print(bodies)
else:
print("請從當前列表{}選擇你要刪除的ID的資訊".format(el))
break
if input("是否繼續刪除(Y/N):").strip().upper() == "Y":
continue
else:
break
elif userInputCode == case[3]:
while 1:
el = []
for key in bodies:
el.append(key)
# print(el)
modifyId = int(input("請輸入要修改的使用者ID:").strip())
if modifyId in el:
print("ID為{}的人的資訊為{}".format(modifyId,bodies.get(modifyId)))
userName = bodies[modifyId]["name"] = input("請輸入使用者NAME:")
userWeight = bodies[modifyId]['weight'] = input("請輸入使用者WEIGHT:")
userHeight = bodies[modifyId]['height'] = input("請輸入使用者HEIGHT:")
userBMI = bodies[modifyId]['BMI'] = str(float(userWeight)/((float(userHeight))**2))
print("修改之後使用者的資訊為:{}".format(bodies[modifyId]))
else:
print("請從當前列表{}選擇你要修改的ID的資訊".format(el))
break
if input("是否繼續修改(Y/N):").strip().upper() == "Y":
continue
else:
break
elif userInputCode == case[4]:
break
else:
print("輸入不合法,請重新輸入!")
continue