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}