第四章 字典{'鍵':'值','名字':'電話號碼'}
映射:通過名稱來訪問其各個值的數據結構
列表:將一系列值組合成數據結構并通過編號來訪問各個值
字典是Python中唯一的內置映射類型,其中的值不按順序排列,而是存儲在鍵下
鍵可能是數、字符串或元組
字典由鍵(必須唯一
,可以是任意數據類型但是唯一即可)及其相應的值組成,這種鍵-值對稱為項
鍵為名字,值為電話號碼
每個鍵與其值之間都用冒號(:)分隔,項之間用逗號分隔,整個字典放在花括號內
空字典(沒有任何項)用兩個花括號表示{}。
phones = {'yanyu':'159368','huangjiaju':'787084','huangjiaiqnag':'784512369','yeshirong':'963214587'}
創建和使用字典
函數dict,從其他映射(如其他字典)或鍵-值對序列創建字典
message = [('name','yanyu'),('age',22)]
yanyu = dict(message)
yanyu#結果為:{'name': 'yanyu', 'age': 22}beyond = dict(name="huangjiaju",age=31)
beyond#結果為:{'name': 'huangjiaju', 'age': 31}
成員資格in
在字典中查找的鍵
,而不是值
在列表中查找的是值
,而不是索引
'''
將字符串"beyond"賦給一個空列表中索引為15的元素
這顯然不可能,因為沒有這樣的元素
除非首先初始化列表
'''
x = []
x[15] = "beyond"#報錯
#改正:初始化列表y
y = [None] * 16
y[15] = "beyond"
y#結果為:[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'beyond']'''
將字符串"beyond"賦給一個空字典的鍵15
'''
z = {}
z[15] = "beyond"
z#結果為:{15: 'beyond'}
將字符串格式設置功能用于字典
format_map,通過一個映射來提供所需的信息
phone = {"yanyu":"1512369","jiaju":'147852','jiaqiang':"789654"}
"jiaju's phone number is {jiaju}.".format_map(phone)#結果為:"jiaju's phone number is 147852."
可指定任意數量的轉換說明符,條件是所有的字段名都是包含在字典中的鍵
template = '''<html>
<head><title>{title}</title></head>
<body>
<h1>{title}</h1>
<p>{text}</p>
</body>''' data = {'title': 'My Home Page', 'text': 'Welcome to my home page!'}
print(template.format_map(data)) #結果為:
<html>
<head><title>My Home Page</title></head>
<body>
<h1>My Home Page</h1>
<p>Welcome to my home page!</p>
</body>
字典方法
1,clear,刪除所有的字典項,什么都不返回(或者說返回None)
d = {}
d['name'] = "beyond"
d['age'] = 31
d#結果為:{'name': 'beyond', 'age': 31}
Y = d.clear()
d#結果為:{}
print(Y)#結果為:None
x和y最初都指向同一個字典,將一個空字典賦給x來“清空”它,這對y沒有任何影響,它依然指向原來的字典
要刪除原來字典的所有元素,必須使用clear,這樣做,y也將是空的
x = {}
y = x
x['key'] = 'value'
y#結果為:{'key': 'value'}
x = {}
x#結果為:{}
y#結果為:{'key': 'value'}
x = {}
y = x
x['key'] = 'value'
y#結果為:{'key': 'value'}
x.clear()
x#結果為:{}
y#結果為:{}
2,copy,返回一個新字典,其包含的鍵-值對與原來的字典相同
(這個方法執行的是淺復制,因為值本身是原件,而非副本)
原件x,副本y,替換副本中的值,原件不受影響;修改副本中的值,原件會發生變化,因為原件指向的也是被修改的值
x={'name':'yanyu','habby':['eat','drink','sing']}
y = x.copy()
y['name'] = "huangjiaju"#替換
y['habby'].remove('eat')#修改
y#結果為:{'name': 'huangjiaju', 'habby': ['drink', 'sing']}
x#結果為:{'name': 'yanyu', 'habby': ['drink', 'sing']}
為避免這種問題,一種辦法是執行深復制,即同時復制值及其包含的所有值
可使用模塊copy中的函數deepcopy
d為原件,c為淺復制,C為深復制
淺復制:替換原件不受影響,修改(append向后追加為修改的一種)原件會受影響
深復制:與原件相互獨立,與對原件操作無任何影響
from copy import deepcopy
d = {}
d['names'] = ['yanyu', 'beyond']
c = d.copy()
C = deepcopy(d)
d['names'].append('Huangjiaju')
c#結果為: {'names': ['yanyu', 'beyond', 'Huangjiaju']}
C#結果為:{'names': ['yanyu', 'beyond']}
d#結果為:{'names': ['yanyu', 'beyond', 'Huangjiaju']}
3,fromkeys,創建一個新字典,其中包含指定的鍵,且每個鍵對應的值都是None
{}.fromkeys(['name', 'age'])#結果為:{'name': None, 'age': None}
也可以直接對dict調用方法fromkeys
dict.fromkeys(['name', 'age'])#結果為:{'name': None, 'age': None}
也可提供特定的值
dict.fromkeys(['name', 'age'], '(unknown)')#結果為:{'name': '(unknown)', 'age': '(unknown)'}
4,get,為訪問字典項提供了寬松的環境
如果你試圖訪問字典中沒有的項,將引發錯誤;而使用get不會這樣
d = {}
d['names'] = "beyond"
print(d['name'])#結果為:報錯 訪問不存在的鍵
print(d.get('name'))#結果為:None 沒有引發異常,而是返回None
d.get('name',"errorover")#結果為:errorover 沒有引發異常,而是返回指定的錯誤信息
d.get("names")#結果為:'beyond'
5,items,返回一個包含所有字典項的列表(字典視圖),其中每個元素都為(key, value)的形式,字典項在列表中的排列順序不確定
d = {'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
d.items()#結果為:dict_items([('Question', 'Do you like beyond?'), ('Answer', 'Yes'), ('Sure?', 666)])
返回值屬于一種名為字典視圖的特殊類型dict_items
確定其長度以及對其執行成員資格檢查
d = {'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
it = d.items()
len(it)#結果為:3
('Sure?', 666) in it#結果為:True
視圖的一個優點是不復制,它們始終是底層字典的反映,本源和視圖是一致的,操作視圖,本源也會跟著操作
d = {'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
it = d.items()
d['Sure?'] = 0
('Sure?',666) in it#結果為:False
d['Sure?'] = 1
('Sure?',1) in it#結果為:True
將字典項復制到列表中
d = {'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
list(d.items())#結果為:[('Question', 'Do you like beyond?'), ('Answer', 'Yes'), ('Sure?', 666)]
6,keys,返回一個字典視圖,其中包含指定字典中的鍵
d = {'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
d.keys()#結果為:dict_keys(['Question', 'Answer', 'Sure?'])
7,pop,可用于獲取與指定鍵相關聯的值
,并將該鍵-值對從字典中刪除
d = {'x': 1, 'y': 2}
d.pop('x') #結果為:1
d #:結果為:{'y': 2}
8,popitem,隨機地彈出一個字典項
方法popitem類似于list.pop,但list.pop彈出列表中的最后一個元素,而popitem隨機地彈出一個字典項,因為字典項的順序是不確定的,沒有“最后一個元素”的概念
d = {'Question': 'Do you like beyond?', 'Answer': 'Yes', 'Sure?': 666}
d.popitem()#結果為:('Sure?', 666)
d#結果為:{'Question': 'Do you like beyond?', 'Answer': 'Yes'}
字典沒有與在列表末尾添加一個元素(append)對應的方法
這是因為字典是無序的,類似的方法毫無意義
9,setdefault,通過鍵獲取相關聯的值,若不包含指定的鍵,則自動添加指定的鍵值對
指定的鍵不存在時,setdefault返回指定的值并相應地更新字典
指定的鍵存在,就返回其值,并保持字典不變
與get一樣,值是可選的,如下的no find和NO;如果沒有指定,默認為None
d = {}
d.setdefault('name', 'no find') #結果為:'no find'
d #:結果為:{'name': 'no find'}d['name'] = 'beyond'
d.setdefault('name', 'NO') #結果為:'beyond'
d #:結果為:{'name': 'beyond'}print(d.setdefault('age'))#結果為:None
d#結果為:{'name': 'beyond', 'age': None} 不存在即添加
10,update,使用一個字典中的項來更新另一個字典
對于通過參數提供的字典,將其項添加到當前字典中
如果當前字典包含鍵相同的項,就替換它
d = {
'title': 'Python Web Site',
'url': 'http://www.python.org',
'changed': 'Mar 14 22:09:15 MET 2021'
}
x = {'title': 'Python Language Website'}
d.update(x)
d#結果為:{'title': 'Python Language Website', 'url': 'http://www.python.org', 'changed': 'Mar 14 22:09:15 MET 2021'}
11,values,返回一個由字典中的值組成的字典視圖
不同于方法keys,方法values返回的視圖可能包含重復的值
d = {}
d[1] = 1
d[2] = 2
d[3] = 3
d[4] = 1
d.values() #結果為:dict_values([1, 2, 3, 1])
要對字典執行字符串格式設置操作,不能使用format和命名參數,而必須使用format_map
本章節介紹的新函數
函數 | 描述 |
---|---|
dict(seq) | 從鍵-值對、映射或關鍵字參數創建字典 |