字典 dict
1.字典是一種可變的容器,可以存儲任意類型的數據
2.字典中的每個數都是用“鍵”(key)進行索引,而不像序列可以用下標進行索引
3.字典中的數據沒有先后關系,字典的存儲是無序的
4.字典中的數據以鍵(key)-值 (value) 對的形式進行存儲.
5.字典的鍵不能重復,且只能用不可變類型作為字典的鍵
字典的字面值表示方法:
字典的表示方式是用 {} 括起來,以冒號(:)分隔鍵-值對,各鍵值對之間用逗號分隔開
創建空字典的字面值: type(查詢類型)
d = {} # 空字典
創建非空的字典
d ={"姓名":"小張","年齡":20} d ={1:"一",2:"二",5:"五"}
dict的構造(創建)函數dict
dict() # 生成一個空的字典,等同於{} dict(iterable) # 用可迭代對象創建一個字典 dict(**kwargs) # 用關鍵字傳參形式生成一個字典 # (字典的鍵名必須是符合標識符命名規則的字符串)
# 示例: d = dict() L = [("姓名","小張"),["年齡",20],"AB"] d = dict(L) d = dict(name="小張",age=20)
字典的鍵(key)必須為不可變的數據類型,可以用數字,字符串,元組等充當字典的鍵
python3中不可變的數據類型:
bool,int,float,complex,str,tuple,frozenset(固定集合),bytes(字節串)
包括:None
python3中可變的數據類型:
# 列表list,字典dict,set(集合),bytearray(字節數組) # (鍵 必須是不可改變的 值可以改變) # 示例: d = {"a":100} d = {"a":(1,2,3)} d = {(1,2,3):"a"} d = {"a":[1,2,3]} d = {[1,2,3]:"a"} #報錯 d = {"a":{"b":100,"c":200}} d = {{1:"一"}:"壹"} # 報錯,字典不能做鍵
字典的基本操作
# 字典的鍵索引 # 用[]運算符可以獲取字典內“鍵”所對應的“值” # 取值語法: # 變量 = 字典[鍵] # 示例: d = {"name":"tarena","age":20} print(d["name"],"今年",d["age"],"歲")
添加和修改字典的鍵值對
# 語法: # 字典[鍵] = 表達式 # 說明: # 鍵不存在,創建鍵,並綁定鍵對應的值 # 鍵存在,修改鍵綁定的值 # 示例: d = {} d{"name"} = "tarena" # 創建新建值對 d["age"] = 15 d["age"] = 16 # 修改age 鍵對應的值為16
刪除字典的元組 del語句
# 語法: # del 字典[鍵] # 作用: # 刪除字典的鍵,同時解除對值的綁定 # 示例: d = {"name":"tarena","age":20} del d["age"]
in / not in 運算符
# 用於字典中,in 運算符用來判斷一個鍵是否在於字典中,如果存在則返回True,否則返回False # not in(不在序列元素) 與 in(在序列元素) 結果相反
# 示例: d = {"name":"tarena","age":15} "name" in d #true 30 in d # False "tarena" in d # False 15 not in d # True # 注:只判斷鍵是否在,不判斷值是否存
練習
# 練習: # 寫程序,實現以下要求: # 1.將如下數據形成一個字典seasons # "鍵" "值" # 1 -----> "春季有1,2,3月" # 2 -----> "夏季有4,5,6月" # 3 -----> "秋季有7,8,9月" # 4 -----> "冬季有10,11,12月" # 讓用書輸入一個整數代表這個季度,打印這個季度的信息,如果用戶輸入的信息不在字典內,則打印“信息不存在” # 方法1 seasons = { 1 : "春季有1,2,3月", 2 : "夏季有4,5,6月", 3 : "秋季有7,8,9月", 4 : "冬季有10,11,12月", } print(seasons) # 方法2 t = {} t[1] = "春季有1,2,3月" t[2] = "夏季有4,5,6月" t[3] = "秋季有7,8,9月" t[4] = "冬季有10,11,12月" x = int(input("請輸入季度(1~4)")) if x in t: print(t[x]) else: print("信息不存在")
字典是可迭代對象
# 字典只能對鍵進行迭代訪問 d = {"name":"tarnea","birthday":(2002,1,1)} for k in d : print(d)
字典的比較運算:
# 運算符: == != # 說明: # 只有鍵和值都完全相同時,才相等,否則不相等 # 示例: {1:"一",2:"二"} == {1:"一",2:"二"} #True {1:"一",2:"二"} == {1:"一",2:"2"} #False
可以用於字典的內建 函數
len(x) # 返回字典的鍵值對的個數 max(x) # 返回字典的鍵的最大值 min(x) # 返回字典的鍵的最小值 sum(x) # 返回字典中所有鍵的和 any(x) # 真值測試,如果字典中其中一個鍵為真值則返回True all(x) # 真值測試,如果字典全部鍵為真值才返True
# 示例: d = {0:"零",5:"伍",8:"捌",3:"叄"} len(d) #4 max(d) #8 min(d) #0 sum(d) #16 any(d) #True all(d) #False
字典的方法
# 方法 # 說明 # D 代表字典對象 D.clear() # 清空字典 D.pop(key) # 移除鍵,同時返回此鍵所對應的值 D.copy() # 返回字典D的副本,只復制一層(淺拷貝) D.update(D2) # 將字典 D2 合並到D中,如果鍵相同,則此鍵的值取D2的值作為新值 D.get(key, default=None) # 返回鍵key所對應的值,如果沒有此鍵,則返回default D.keys() # 返回可迭代的 dict_keys 集合對象 D.values() # 返回可迭代的 dict_values 值對象 D.items() # 返回可迭代的 dict_items 對象
# 示例; d1 = {1:"one",2:"二",3:"三"} for t in d1.items(): print(t) #(1,"one"),(2,"二"),(3:"三") for k,v in d1.items(): print("k=",k,"v=",v)
練習
# 寫一個程序,輸入一個字符串,寫程序統計出這個字符串的字符個數的字符的種類 # 如: # 請輸入: ABCDABCABA # 輸出結果: # 字符 A:4次 # 字符 B:3次 # 字符 D: 1次 # 字符 C:1次 # (注:不要求輸出的順序) s = input("請輸入一個字符串") # 統計字符的個數: # 如果第一次出現這個字符: # 用這個字符創建字典的鍵,值為1 # 如果第二次或之后出現這個字符,直接將鍵對應的值加1 d ={} for ch in s: if ch not in d: #第一次出現 d[ch]=1 else: d[ch]+=1 print(d) for k in d: print("字符",k,"次",d[k],"次")
字典推導式:
字典推導式是用可迭代對象依次生成字典內元素的表達式
# 語法: # {鍵表達式:值表達式 for 變量 in 可迭代對象 [if真值表達式]...} # 注:[]的內容代表可省略 # 示例: # 生成一個字典,鍵為數字(10以內),值為鍵的平方 d = {x : x **2 for x in range(10)} # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
練習:
# 有如下字符串列表:k = ["tarena","xiaozhang","hello"] # 生成如下字典: # d = {"tarena":6,"xiaozhang":9,:"hello":5} # 注:字典的值為鍵的長度 d = {k:len(k)for k in l} print(d)
# 已知有兩個字符串列表: # Nos = [1001,1002,1005,1008] # names = ["Tom","Jerry","Spike","Tyke"] # 生成以Nos 中項為鍵,以names中的項為值的字典 # 打印下 # {1008: 'Tyke', 1001: 'Tom', 1002: 'Jerry', 1005: 'Spike'} Nos = [1001,1002,1005,1008] names = ["Tom","Jerry","Spike","Tyke"] # 方法1 d = {} for i in range(len(Nos)): d[Nos[i]] = names[i] print(d) # 方法2 d = {Nos[i]:names[i] for i in range(len(Nos))} print(d) # 方法3 d = {} for n in Nos: d[n] = names[Nos.index(n)] print(d) # 方法4 d = {n:names[Nos.index(n)] for n in Nos} print(d)
字典 VS 列表
1.都是可變對象
2.索引方式不同,列表用整數索引,字典用鍵索引
3.字典的插入,刪除,修改的速度可能會快於列表(重要)
4.列表的存儲是有序的,字典的存儲是無序的