6-1 字典的基本語法
針對有對應關係的資料我們可以用字典的資料型來儲存,字典的資料結構是以鍵(keys):值(values)表示,其中鍵(keys)必須唯一,值(values)可以不唯一,我們可以藉由鍵(keys)來查詢值(values)。字典的基本語法試用{}表示或以dict()建立空字典。以下說明字典的建立方法:
程式碼
#字典建立方法(1)
dict1={"banana":30,"apple":50,"orange":80}
print(dict1)
#字典建立方法(2)
list2=[["banana",30],["apple",50],["orange",80]]
dict2=dict(list2)
print(dict2)
Python畫面
6-2 字典的取值
字典取值方式無法用索引值方式取值,需要靠鍵(keys)來取得相對應的值(values),語法為字典名稱[鍵],結果會得到相對應的值。但若鍵不再字典中則會得到錯誤訊息導致程式中斷。
程式碼
#字典取值方式(1)
dict1={"banana":30,"apple":50,"orange":80}
print(dict1["banana"])
print(dict1["pieapple"])
Python畫面
對於沒有鍵(keys)查詢會導致錯誤訊息程式中斷的問題,可以用字典名稱.get()函數避免掉,沒有鍵(keys)查詢的部分可以設定回傳的結果,這樣就不會因為錯誤訊息導致程式中斷,說明方式如下:
程式碼
#字典取值方式(2)
dict1={"banana":30,"apple":50,"orange":80}
print(dict1.get("banana","查無此鍵!"))
print(dict1.get("pieapple","查無此鍵!"))
print(dict1.get("pieapple"))
Python畫面
字典名稱.get()函數中有兩個參數,字典名稱.get(鍵值,鍵值不存在的回傳值),若第二個參數沒有設定,查詢不到鍵值時,回傳值預設是None。
6-3
字典的修改、新增與刪除
*修改:要修改某一個鍵對應的值,可以直接重新指定即可。即字典名稱[鍵]=新值
*新增:若要新增一個鍵,可以直接以指定的方式即可。即字典名稱[新鍵]=新值
讀者可以看到,修改與新增的寫法是相同的,如果鍵是存在的,則功能為修改;若鍵不存在,功能為新增。
*刪除:刪除可以分三種情形
#1 刪除某一個鍵-值:語法 del 字典名稱.[鍵]
#2 刪除整個字典:語法 del 字典名稱
#3 清空字典:語法 字典名.clear()
程式碼
#字典的修改、新增與刪除
dict1={"banana":30,"apple":50,"orange":80}
print("修改前dict1:{}".format(dict1))
dict1["banana"]=100
print("修改後dict1:{}".format(dict1))
dict1["piebanana"]=50
print("新增後dict1:{}".format(dict1))
del
dict1["apple"]
print("刪除apple後的dict1:{}".format(dict1))
dict1.clear()
print("清空dict1:{}".format(dict1))
del
dict1
print("移除dict1:{}".format(dict1))
Python畫面
6-4
字典的進階用法
以下繼續介紹字典的進階用法並用一個成績查詢系統來說明函數的用法:
程式碼
#字典的相關函數操作(1)
score_list=[["王曉明",[60,70,80]],["陳大華",[100,20,80]],["張小美",[60,65,83]]]
score_dict=dict(score_list)
while
True:
query=input("0:查詢學生人數\n1:學生姓名列表\n2:學生姓名查詢\n3:成績表\n4:新增名單\n5:移除名單\n任意鍵離開查詢...")
if query=="0":
print("學生人數:{}人".format(len(score_dict)))
elif query=="1":
for n in score_dict.keys(): print(n)
elif query=="2":
student_name=input("請輸入姓名...")
if student_name in score_dict.keys():
print("為本班學生!")
else:
print("非本班學生!")
elif query=="3":
print("{:<6s}{:<4s}{:<4s}{:<4s}".format("姓名","國文","英文","數學"))
for name,s in score_dict.items():
print("{:<6s}{:<6d}{:<6d}{:<6d}".format(name,s[0],s[1],s[2]))
elif query=="4":
student_name=input("請新增學生姓名...")
if student_name in score_dict.keys():
print("該學生已存在!")
else:
score=input("請分別輸入國文、英文、數學成績(請以,分開)...")
score_dict.setdefault(student_name,list(map(int,score.split(","))))
elif query=="5":
student_name=input("請輸入學生姓名...")
if student_name not in
score_dict.keys():
print("該學生不存在!")
else:
del score_dict[student_name]
else:
print("<<結束查詢>>")
break
Python畫面
接下來說明一下字典複製後在指定給另一個變數與將字典直接指定給另一個變數的差異,兩者都能夠呈現出字典複製的效果,但依不同的需求寫法就會不一樣。以變數指定的方式在元字典內容改變後,被指定的那個變數的內容也會跟著改變;如果用使用字典名稱.copy()函數,則原字典內容改變不會影響被指定的變數內容。下面程式碼將說明兩者差異:
程式碼
#字典的相關函數操作(2)
dict1={"banana":30,"apple":50,"orange":80}
dict2=dict1.copy()
dict3=dict1
print("dict2與dict3是否相同:{}".format(dict2==dict3))
dict1["banana"]=100
print("dict2與dict3是否相同:{}".format(dict2==dict3))
print("dict2={}".format(dict2))
print("dict3={}".format(dict3))
Python畫面
字典更新的功能,可以在一次性需要新增或更新較多數據時發揮很大的功用。當鍵存在時,則值會更新;如果鍵不存在,則會新增一組鍵-值元素,達到同時新增與更新數據的效果。
程式碼
#字典的相關函數操作(3)
keys_list=["A","B","C","D","E"]
values_list=[100,200,300,400,500]
dict3=dict(zip(keys_list,values_list))
print("新增or更新前dict3={}".format(dict3))
keys_update=input("請輸入要新增or更新的key(用,隔開)...")
values_update=input("請輸入要新增or更新的value(用,隔開)...")
new_dict=dict(zip(keys_update.split(","),list(map(int,values_update.split(",")))))
dict3.update(new_dict)
print("新增or更新後dict3={}".format(dict3))
Python畫面
zip()函數的使用可以將多個串列中相同索引值的元素組成元組(有種拉拉鍊的感覺…),可用list()轉成串列型態,如果只有兩個串列,則可使用dict()轉成字典型態。我們參考以下網路資料可發現當兩個串列長度不同時,會以短的為主,長的多餘的部分則會被捨去。另外zip(*)函數可將結果轉換回多維串列。
留言
張貼留言