python基礎教程(第三版)學習筆記(四)
第四章 字典
字典一種可通過名稱來訪問其各個值的資料結構。這種資料結構稱為對映。字典是Python中唯一的內建對映型別,其中的值不按順序排列,而是儲存在鍵下。鍵可能是數、字串或元組。
4.1 字典的用途
i表示棋盤的狀態,其中每個鍵都是由座標組成的元組;
ii儲存檔案修改時間,其中的鍵為檔名;
iii數字電話/地址簿。
4.2 建立和使用字典
建立字典的格式為一對大括號{}和冒號:
{鍵名:值}
4.2.1 函式dict
可使用函式dict從其他對映(如其他字典)或鍵-值對序列建立字典。其實dict是字典的建構函式(關於建構函式以後說)。
'''
item=[('name','張玉'),('李四',43)] d=dict(item) print(d)
'''
{'name': '張玉', '李四': 43}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
還可以使用關鍵字實參來呼叫這個函式,如下所示:
'''
d=dict(name='張玉','李四'=42)
print(d)
'''
{'name': '張玉', '李四': 42}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
4.2.2基本的字典操作
字典的基本行為在很多方面都類似於序列。
i len(d)返回字典d;包含的項(鍵值對)數。
ii d[k]返回與鍵k相關聯的值。
iii d[k] = v將值v關聯到鍵k。
iv del d[k]刪除鍵為k的項。
v k in d檢查字典d是否包含鍵為k的項。
雖然字典和列表有多個相同之處,但也有一些重要的不同之處。
鍵的型別:字典中的鍵可以是整數,但並非必須是整數。字典中的鍵可以是任何不可變的型別,如浮點數(實數)、字串或元組。
自動新增:即便是字典中原本沒有的鍵,也可以給它賦值,這將在字典中建立一個新項。
然而,如果不使用append或其他類似的方法,就不能給列表中沒有的元素賦值。
成員資格:表示式k in d(其中d是一個字典)查詢的是鍵而不是值,而表示式v in l(其中l是一個列表)查詢的是值而不是索引。這看似不太一致,但你習慣後就會覺得相當自然。畢竟如果字典包含指定的鍵,檢查相應的值就很容易。
字典的定義{鍵:值}例如:
'''
results={"張三":68,"李四":94,"王五":88}
print(results,type(results))
'''
{'張三': 68, '李四': 94, '王五': 88} <class 'dict'>
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
字典的鍵是唯一的不能重複。
'''
result={'張三':68,'李四':94,'王五':88,'張三':77}
print(result,type(result))
'''
{'張三': 77, '李四': 94, '王五': 88} <class 'dict'> ------------------ (program exited with code: 0) 請按任意鍵繼續. . .
可以用format設定字典的格式。
'''
print("張三的成績是{張三}".format_map(results))
'''
張三的成績是68
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
像這樣使用字典時,可指定任意數量的轉換說明符,條件是所有的欄位名都是包含在字典中的鍵。在模板系統中,這種字串格式設定方式很有用(下面的示例使用的是HTML)
'''
template='''
<html>
<head>
<title>{title}</title>
</head>
<body>
<h1>{text}</h1>
<p>{title}</p>
<body>
</html>
'''
date={'title':'Hello world','text':'歡迎您:'}
print(template.format_map(date))
'''
<html>
<head>
<title>Hello world</title>
</head>
<body>
<h1>歡迎您:</h1>
<p>Hello world</p>
<body>
</html>
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
4.2.3 字典的方法
1、clear
刪除所有的字典項,這種操作是就地執行的(就像list.sort一樣),因此什麼都不返回(或者說返回None)。
clear和賦予空字典的區別:
'''
x={}
y=x
x['鍵']='值'
print(x)
print(y)
x={}
print("x={}後的字典")
print(x)
print(y)
print("下面用clear:")
a={}
b=a
print(a)
print(b)
print('clear後的字典:')
print(a)
print(b)
'''
{'鍵': '值'}
{'鍵': '值'}
x={}後的字典
{}
{'鍵': '值'}
下面用clear:
{}
{}
clear後的字典:
{}
{}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
2、copy
返回一個新字典,其包含的鍵-值對與原來的字典相同(這個方法執行的是淺複製,因為值本身是原件,而非副本)。
一種辦法是執行深複製,即同時複製值及其包含的所有值,等等。為此,可使用模組copy中的deepcopy函式。
3、fromkeys
建立一個新字典,其中包含指定的鍵,且每個鍵(注意:用[]括起來,否則會出現意想不到的結果)對應的值都是None。
'''
print({}.fromkeys(["姓名","年齡"]))
'''
{'姓名': None, '年齡': None}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
這個示例首先建立了一個空字典,再對其呼叫方法fromkeys來建立另一個字典,這顯得有點多餘。你可以不這樣做,而是直接對dict(dict是所有字典所屬的型別。)呼叫方法fromkeys。
'''
print(dict.fromkeys(["姓名","年齡"]))
'''
{'姓名': None, '年齡': None}
{'姓名': None, '年齡': None}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
4、get
訪問字典中沒有的項。
'''
print(results.get('張三'))
'''
68
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
沒有被訪問的項返回None,不會報錯。
5、items
返回一個包含所有字典項的列表,其中每個元素都為(key, value)元組。字典項在列表中的排列順序不確定。
'''
print(results.items())
'''
dict_items([('張三', 68), ('李四', 94), ('王五', 88)])
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
6、key
返回指定字典中的鍵。
7、values
返回指定字典中的值。
8、pop
彈出字典中指定鍵的元素。
'''
c={"a":1,"b":2,"c":3}
print(c)
print(c.pop("b"))
print(c)
'''
{'a': 1, 'b': 2, 'c': 3}
2
{'a': 1, 'c': 3}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
9、popitem
隨機地彈出字典的項。
10、setdefault
有點像get,因為它也獲取與指定鍵相關聯的值,但當在字典不包含指定的鍵時,setdefault將在字典中新增指定的鍵-值對,並返回None。
'''
print(c.setdefault("d"))
print(c)
'''
None
{'a': 1, 'c': 3, 'd': None}
------------------
(program exited with code: 0)
請按任意鍵繼續. . .
11、uptate
使用一個字典中的項來更新另一個字典。對於通過引數提供的字典,將其項新增到當前字典中。如果當前字典包含鍵相同的項,就替換它。
(待續)