1. 程式人生 > >005-2018-09-07 字典

005-2018-09-07 字典

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