## 1.1 概述 > 說白了就是鍵值對的映射關係 > > 不會丟失數據本身關聯的結構,但不關註數據的順序 > > 是一種可變類型 ```py 格式:dic = {鍵:值, 鍵:值} ``` * 鍵的類型:字典的鍵可以是任何不可變的類型,如浮點數,字元串,元組 ## 1.2 函數dict 可以從其他 ...
1.1 概述
說白了就是鍵值對的映射關係
不會丟失數據本身關聯的結構,但不關註數據的順序
是一種可變類型
格式:dic = {鍵:值, 鍵:值}
- 鍵的類型:字典的鍵可以是任何不可變的類型,如浮點數,字元串,元組
1.2 函數dict
可以從其他映射或鍵值對創建字典
items = [('name', 'Gumby'), ('age', 42)]
d =dict(items)
print(d)
> {'name': 'Gumby', 'age': 42}
d = dict(name='Gumby', age=42)
print(d)
> {'name': 'Gumby', 'age': 42}
1.3 字典的基本操作
num = len(d) # 返回字典的鍵值對數量
str1 = d[鍵] # 參數為鍵 返回值為對應的值
d[鍵] = '值' # 將tom賦值給name1鍵
test = 鍵 in 字典名字 # 檢查name3鍵是否在字典中
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12,
'name_c':'lily', 'age3':14}
num = len(d) # 返回字典的鍵值對數量
print('num=' + str(num))
> num=6
str1 = d['name_a'] # 參數為鍵 返回值為對應的值
print('name_a=' + str1)
> name_a=Gumby
d['name_a'] = 'tom' # 將tom賦值給name1鍵
print('name_a=' + d['name_a'])
> name_a=tom
test = 'name_c' in d # 檢查name3鍵是否在字典中
print(test)
> True
1.4 與format相結合
將字元串格式設置功能用於字典
使用format_map將兩者結合起來
phonebook = {'bob' : 1211, 'tom': 2322}
str1 = "I am bob. My phone is {bob}".format_map(phonebook)
print(str1)
> I am bob. My phone is 1211
1.5 字典常用方法
1.5.1 clear刪除所有字典項
就地執行,無返回值
d = {
'name_a':'Gumby', 'age1':42,
'name_b':'bob', 'age2':12,
'name_c':'lily', 'age3':14}
d.clear()
print(d)
> {}
python中的變數賦值,是將變數名指向該地址,對該變數名的字典操作,實際上是對該地址存儲的字典進行操作,如:
d = { 'name_a' :'Gumby', 'age1':42, 'name_b' :'bob', 'age2':12, 'name_c':'lily', 'age3':14} x = d x.clear() print(x) print(d) > {} > {} # 發現兩個字典均被清空
若將x再次賦其他值,對原來的字典沒有影響
d = { 'name_a' :'Gumby', 'age1':42, 'name_b' :'bob', 'age2':12, 'name_c':'lily', 'age3':14} x = {} x.clear() print(d) print(x) > {'name_a': 'Gumby', 'age1': 42, 'name_b': 'bob', 'age2': 12, 'name_c': 'lily', 'age3': 14} {}
1.5.2 copy淺複製與深複製
淺複製
返回一個新字典,與原來的字典完全相同(淺複製)
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
x = d.copy()
print(d)
print(x)
>
{'name_a': 'Gumby', 'age1': 42, 'name_b': 'bob', 'age2': 12}
{'name_a': 'Gumby', 'age1': 42, 'name_b': 'bob', 'age2': 12}
淺複製要分兩種情況進行討論:
1)當淺複製的值是不可變對象(字元串、元組、數值類型)時和“賦值”的情況一樣,對象的id值(id()函數用於獲取對象的記憶體地址)與淺複製原來的值相同。
2)當淺複製的值是可變對象(列表、字典、集合)時會產生一個“不是那麼獨立的對象”存在。有兩種情況:
-
第一種情況:複製的對象中無複雜子對象,原來值的改變並不會影響淺複製的值,同時淺複製的值改變也並不會影響原來的值。原來值的id值與淺複製原來的值不同。
-
第二種情況:複製的對象中有複雜子對象(例如列表中的一個子元素是一個列表),如果不改變其中複雜子對象,淺複製的值改變並不會影響原來的值。 但是改變原來的值中的複雜子對象的值會影響淺複製的值。
參考:Python中的賦值(複製)、淺拷貝與深拷貝 - 知乎 (zhihu.com)
深複製
模塊copy中的deepcopy
可以同時複製值以及包含的所有值
from copy import deepcopy
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
x = deepcopy(d) # 深
y = d.copy() # 淺
x.clear()
print(d)
print(y)
1.5.3 fromkeys 按條件創建字典
創建一個新字典,其中包含指定的鍵,且每個鍵對應的值都是None
d = dict.fromkeys(['name','age'])
print(d)
> {'name': None, 'age': None}
若不想使用預設值None 可以提供特定的值
d = dict.fromkeys(['name','age'], 'default')
print(d)
> {'name': 'default', 'age': 'default'}
1.5.4 get 通過鍵獲取值
原來的直接通過鍵獲取對應的值時,可能因為字典中沒有該鍵而報錯。
d = dict.fromkeys(['name','age'], 'default')
print(d['weight'])
>
print(d['weight'])
~^^^^^^^^^^
KeyError: 'weight'
而get方法下,尋找不存在的鍵值時,會返回None(可指定),不會報錯
d = dict.fromkeys(['name','age'], 'default')
print(d.get('weight'))
> None
指定失敗返回值為 N/A (可用於返回錯誤信息)
d = dict.fromkeys(['name','age'], 'default')
print(d.get('name', 'N/A'))
> N/A
查找成功,正常返回對應值
d = dict.fromkeys(['name','age'], 'default')
print(d.get('name', 'N/A'))
> default
1.5.5 items 將字典變成列表輸出
返回一個包含所有字典項的列表,其中每個元素都為(key, value)的形式,順序不固定
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
li = d.items()
print(li)
> dict_items([('name_a', 'Gumby'), ('age1', 42), ('name_b', 'bob'), ('age2', 12)])
返回值屬於字典視圖的特殊類型,特點是不複製,始終是原字典的反映,隨原字典改變而改變
d['name_a'] = 'tom' # 修改原字典
print(li)
>
dict_items([('name_a', 'tom'), ('age1', 42), ('name_b', 'bob'), ('age2', 12)])
1.5.6 keys 返回字典的鍵
返回值為字典視圖
d = {
'name_a' :'Gumby', 'age1':42,
'name_b' :'bob', 'age2':12}
li = d.keys()
print(li)
> dict_keys(['name_a', 'age1', 'name_b', 'age2'])
1.5.7 pop獲取鍵對應的值,並刪除鍵值
d = {'name_a' :'Gumby', 'age1':42}
li = d.pop('name_a')
print(li)
print(d)
>
Gumby
{'age1': 42}
1.5.8 popitem “彈出”一組鍵值對
隨機返回一組鍵值對,並從字典中刪去該鍵值對,與列表中的pop方法類似,只是字典沒有最後一位的概念
d = {'name_a' :'Gumby', 'age1':42}
print(d.popitem())
print(d.popitem())
print(d)
>
('age1', 42)
('name_a', 'Gumby')
{}
d = {'name_a' :'Gumby', 'age1':42}
d_len = len(d.items())
print(d_len)
i = 0
while(i < d_len):
print(d.popitem())
i = i + 1
>
2
('age1', 42)
('name_a', 'Gumby')
1.5.9 setdefault 獲取指定鍵值 無則添加
有點像get 但對於找不到指定的鍵時,會添加指定的鍵值
d = {}
print(d.setdefault('name', 'None'))
print(d)
>
None
{'name': 'None'}
1.5.10 update 使用A字典的項更新B字典
d1 = {'name': 'bob', 'age': 12}
d2 = {'name': 'tom'}
d1.update(d2)
print(d1)
> {'name': 'tom', 'age': 12}
1.5.11 values 返回字典的值
不同於鍵的唯一性,values的返回值可能有相同值
d1 = {'name': 'bob', 'age': 60, 'weight': 60}
print(d1.values())
> dict_values(['bob', 60, 60])
返回類型同樣為字典視圖