1. 程式人生 > >Python(10)--字典--深淺複製

Python(10)--字典--深淺複製

對映:

  通過名稱來訪問值的資料結構

字典:

  字典是Python唯一的內建對映型別

  字典的值是無序的,儲存在鍵下

  鍵可以是數、字串、元組

  鍵必須是獨一無二的


 

建立和使用字典:

  字典是由花括號{}括起來的鍵值對

  一個鍵值對為一項

  每隔鍵和值都用冒號:分隔

  項之間用逗號,分隔

  空字典用就是空的花括號表示

>>> phonebook = {"Bne": 123, "Yuan": 456, "Bone": 789}
>>> namebook = {}
>>> phonebook
{'Bne': 123, 'Yuan': 456, 'Bone': 789}
>>> namebook
{}

  

函式dict:  

  可以使用dict函式從其他對映或者鍵值對序列建立字典

>>> items = [("name", "Yuan"), ("age", 23)]
>>> d = dict(items)
>>> d
{'name': 'Yuan', 'age': 23}
>>> d["name"]
'Yuan'

# 還可以使用關鍵字引數
>>> d = dict(name="Yuan", age=23)
>>> d
{'name': 'Yuan', 'age': 23}

  跟str、list、tuple一樣,如果沒有提供引數,dict返回的是一個空字典

>>> list()
[]
>>> str()
''
>>> tuple()
()
>>> dict()
{}

  

字典操作:

# len(d)返回字典包含的項的數量
>>> d
{'name': 'Yuan', 'age': 23}
>>> len(d)
2

# d[k]返回與鍵k相關聯的值
>>> d
{'name': 'Yuan', 'age': 23}
>>> d["age"]
23

# d[k] = v  將值v關聯到k,若存在則修改,不存在則新增
>>> d
{'name': 'Yuan', 'age': 23}
>>> d["name"] = "Bone"
>>> d
{'name': 'Bone', 'age': 23}
>>> d["aaa"] = "song"
>>> d
{'name': 'Bone', 'age': 23, 'aaa': 'song'}

# del d[k] 刪除鍵為k的項
>>> d
{'name': 'Bone', 'age': 23, 'aaa': 'song'}
>>> del d["aaa"]
>>> d
{'name': 'Bone', 'age': 23}

# k in d 檢查字典d是否包含鍵為k的項
>>> d
{'name': 'Bone', 'age': 23}
>>> "name" in d
True
>>> "a" in d
False  
  • 鍵的型別:字典中的鍵可以使任何不可變的型別
  • 自動新增:給字典中沒有的鍵賦值,就會在改字典中建立一個新的項
  • 成員資格:列表v in l 查詢的是值,而字典的k in d 查詢的是鍵不是值,通過找到鍵再檢查相應的值

 


 

format_map:將字串格式設定功能用於字典

  通過在字典中儲存一系列命名的值,使得格式設定更簡單

>>> phonebook
{'Bne': 123, 'Yuan': 456, 'Bone': 789}
>>> "Yuan's phone number is {Yuan}".format_map(phonebook)
"Yuan's phone number is 456"

  


 

字典方法:

clear()        刪除欄位所有項

>>> d
{'name': 'Bone', 'age': 23}
>>> d.clear()
>>> d
{}

  

copy()        返回一個副本,包含的項和原字典相同(淺複製)

>>> x = {"a": 123, "b": 444, "c": [1, 2, 6, "asd"]}
>>> y = x.copy()
>>> y["c"].remove("asd")
>>> y["a"] = "xxx"
>>> y
{'a': 'xxx', 'b': 444, 'c': [1, 2, 6]}
>>> x
{'a': 123, 'b': 444, 'c': [1, 2, 6]}

# 這個方法執行的是淺複製,淺複製不會複製子物件,所以原始資料改變,子物件也會改變

  

deepcopy()      copy模組中的函式,執行深複製,同時複製值和其包含的所有值

>>> from copy import deepcopy
>>> x = {"c": [1, 2, 6, "asd"]}
>>> y = x.copy()
>>> z = deepcopy(x)
>>> x["c"].append("666")
>>> x
{'c': [1, 2, 6, 'asd', '666']}
>>> y
{'c': [1, 2, 6, 'asd', '666']}
>>> z
{'c': [1, 2, 6, 'asd']}

# 深複製,包含物件裡面的子物件的複製,所以原始物件的改變不會造成深拷貝里任何子元素的改變

  

fromkeys(seq[, val])        返回一個字典,鍵都來自seq,值都為val(預設是None),可直接用dict呼叫

>>> {}.fromkeys(["name", "age"])
{'name': None, 'age': None}

# 上面先建立以個空字典然後呼叫方法來生成一個新字典,顯然多餘了,可以直接用dict呼叫

>>> dict.fromkeys(["name", "age"], "---")
{'name': '---', 'age': '---'}
>>>

  

 get(key[, defaule])        訪問字典的項,使用get訪問不存在的鍵,不會報錯,而是返回指定的defaule(預設是None)

>>> d
{}
>>> print(d["name"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'name'
>>> print(d.get("name"))
None

  

items()        返回一個迭代器(實際是一個檢視),包含字典的各項(key, value)對

>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"}
>>> d.items()
dict_items([('name', 'Bone'), ('age', 25), ('url', 'www.python.org')])

  

keys()        返回一個字典檢視,包含字典的key

>>> d
{'name': 'Bone', 'age': 25, 'url': 'www.python.org'}
>>> d.keys()
dict_keys(['name', 'age', 'url'])

  

values()      返回一個字典檢視,包含字典的value

>>> d
{'name': 'Bone', 'age': 25, 'url': 'www.python.org'}
>>> d.values()
dict_values(['Bone', 25, 'www.python.org'])

  

pop(key[, d])        刪除並返回給定鍵的值,並刪除鍵值對

>>> d
{'name': 'Bone', 'age': 25, 'url': 'www.python.org'}
>>> d.pop("name")
'Bone'

  

popitem()        隨機刪除一項,並返回鍵值對

>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"}
>>> d.popitem()
('url', 'www.python.org')

  

setdefault(key[, default])        類似get,如果key存在就返回對應的值,不存在就新增到字典中

>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"}
>>> d.setdefault("name")
'Bone'
>>> d.setdefault("aa")
>>> d
{'name': 'Bone', 'age': 25, 'url': 'www.python.org', 'aa': None}
>>> d.setdefault("aaa", "haha")
'haha'
>>> d
{'name': 'Bone', 'age': 25, 'url': 'www.python.org', 'aa': None, 'aaa': 'haha'}

  

update(other)        使用一個字典的項來更新另一個字典

>>> d = {"name": "Bone", "age": 25, "url": "www.python.org"}
>>> x = {"x": 1, "y":2, "age": 18}
>>> d.update(x)
>>> d
{'name': 'Bone', 'age': 18, 'url': 'www.python.org', 'x': 1, 'y': 2}
>>> x
{'x': 1, 'y': 2, 'age': 18}