python-字典

jimmy0k發表於2018-11-14

 

·字典(dict)

筆記:

  • 字典(對映)成對出現,由鍵及其相應的值組成,鍵-值對稱作項(item),字典是python中唯一內建對映型別。字典中的鍵必須是獨一無二的。
  • 在python 2中進行拷貝需要呼叫copy模組;而在python 3 中可以直接使用淺拷貝copy(),當使用深拷貝deepcopy(),則需要呼叫copy模組。
  • 相比於檢查列表是否包含指定的值,檢查字典是否包含指定的鍵效率更高。

 

@ 建立一個字典


 使用值對序列建立字典(鍵值在元組中組成列表):

item = [(`name`,`jimmy`),(`age`,`25`),(`address`,`fujian`)]
x = dict(item)
print(x)
列印結果:{`name`: `jimmy`, `age`: `25`, `address`: `fujian`}

使用關鍵字建立字典:

d = dict(name=`jimmy`,age=25)
print(d)
列印結果:{`name`: `jimmy`, `age`: 25}

 

@ 字典的基本操作


 字典的基本操作:

x ={`name`:`jimmy`,`age`:`25`,`address`:`fujian`}
print(`len()查詢字典鍵-值對數:`,len(x))    
print("x[`name`]查詢name鍵的值:",x[`name`]) 
x[`address`] = `beijing`     #x[``]=`value`:替換address鍵對應的值
del x[`address`]             #del x[``]:刪除字典中鍵為address的項
print(`檢查字典中是否包含鍵為name的項(成員資格):`,`name` in x)

 

@ 字典的方法


fromkeys():建立一個新字典,其中包含指定的鍵,值預設為None

x = dict.fromkeys([x for x in range(1,11)])  #建立10個項(鍵-值對)
print(x)
列印結果: {
1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None, 9: None, 10: None}

 淺拷貝(copy):

>>> x ={`name`:`jimmy`,`age`:`25`,`address`:[`fujian`,`beijing`]}
>>> y = x.copy()
>>> print("x的ID為:",id(x))
x的ID為: 2394409585904
>>> print("y的ID為:",id(y))
y的ID為: 2394409586120
>>> y[`age`] = 20
>>> print(x)
{`name`: `jimmy`, `age`: `25`, `address`: [`fujian`, `beijing`]}
>>> print(y)
{`name`: `jimmy`, `age`: 20, `address`: [`fujian`, `beijing`]}
#結論:x和y指向的記憶體地址不同,所以兩個字典的值不會相互影響
>>> x[`address`].remove(`beijing`) >>> print(x) {`name`: `jimmy`, `age`: `25`, `address`: [`fujian`]} >>> print(y) {`name`: `jimmy`, `age`: 20, `address`: [`fujian`]}
#結論:刪除x字典的beijing時,y字典的值也隨著刪除。
這是因為淺拷貝只複製了第一層資料,字典裡儲存的子列表,列印出來是子列表,
在記憶體裡,字典裡只是儲存了子列表的記憶體地址,子列表在記憶體裡是單獨儲存的。
簡單的來說:x、y指向不同的地址,但是它們共用子列表中的值。

深拷貝(deepcopy):python3 中需要匯入copy模組

>>>from copy import deepcopy  #匯入模組
>>> x ={`name`:`jimmy`,`age`:`25`,`address`:[`fujian`,`beijing`]}
>>> y = deepcopy()
>>> print("x的ID為:",id(x))
x的ID為: 2394409585904
>>> print("y的ID為:",id(y))
y的ID為: 2394409586120
>>> y[`age`] = 20
>>> print(x)
{`name`: `jimmy`, `age`: `25`, `address`: [`fujian`, `beijing`]}
>>> print(y)
{`name`: `jimmy`, `age`: 20, `address`: [`fujian`, `beijing`]}
#結論:x和y指向的記憶體地址不同,所以兩個字典的值不會相互影響
>>> x[`address`].remove(`beijing`)
>>> print(x)
{`name`: `jimmy`, `age`: `25`, `address`: [`fujian`]}
>>> print(y)
{`name`: `jimmy`, `age`: 20, `address`: [`fujian`, `beijing`]}
#結論:刪除x字典的beijing時,y字典的值不會被刪除。這是因為深複製把子列表也複製了一份

字典方法集合:

>>> x = {`name`:`jimmy`,`age`:`18`,`address`:`Fujian`,`phone`:`123456`}
>>> y = {`age`:`100`}
>>> print(x.get(`name`,`not found it`))     
jimmy  #get():查詢x字典中name鍵的值,返回其鍵的值。它還提供預設值;x中沒有name時,返回指定值not found it(沒有指定則預設為None)
>>> print(x.setdefault(`favorire`,`apple`))
apple  #setdefault():查詢x字典中favorite鍵的值,返回其鍵的值;如果沒有找到鍵,將在字典中新增一個鍵-值對(如果沒有指定則預設為None)
>>> print(x) {`name`: `jimmy`, `age`: `18`, `address`: `Fujian`, `phone`: `123456`, `favorire`: `apple`} >>> print("item()方法:",x.items()) #items():返回所有字典項(鍵值對)的列表 item()方法: dict_items([(`name`, `jimmy`), (`age`, `18`), (`address`, `Fujian`), (`phone`, `123456`), (`favorire`, `apple`)]) >>> print("keys()方法:",x.keys()) #keys():返回字典中的鍵 keys()方法: dict_keys([`name`, `age`, `address`, `phone`, `favorire`]) >>> print("values()方法:",x.values()) #values():返回字典中的值 values()方法: dict_values([`jimmy`, `18`, `Fujian`, `123456`, `apple`]) >>> print("pop()方法:",x.pop(`name`)) #pop(): 獲取指定鍵相關聯的值,並將該鍵-值對從字典中刪除。 pop()方法: jimmy >>> print(x) {`age`: `18`, `address`: `Fujian`, `phone`: `123456`, `favorire`: `apple`} >>> print("popitem()方法:",x.popitem()) #popitem():隨機彈出一個項鍵值對(字典無序) popitem()方法: (`favorire`, `apple`) >>> print(x) {`age`: `18`, `address`: `Fujian`, `phone`: `123456`} >>> print("update()方法:",x.update(y))  #update():使用一個字典來更新另一個字典,如果字典中沒有,將新增一個項 update()方法: None >>> print(x) {`age`: `100`, `address`: `Fujian`, `phone`: `123456`} >>> print("clear()方法:",x.clear()) #刪除所有字典項 clear()方法: None >>> print(x) {}

 

@ 淺拷貝應用:


 假設tom和jimmy分別持有信用卡主卡和副卡,共享額度10000,兩個人都可以使用信用卡消費。

>>> creditcard = [`name`,[`saving`,10000]]
>>> tom = creditcard.copy()
>>> jimmy = creditcard.copy()
>>> tom[0] = `tom`
>>> jimmy[0] = `jimmy`
>>> tom[1][1] = 5000     #假設tom消費5000元
>>> print(`信用卡餘額:`,creditcard)
信用卡餘額: [`name`, [`saving`, 5000]]
>>> print(`tom的剩餘額度`,tom)
tom的剩餘額度 [`tom`, [`saving`, 5000]]
>>> print(`jimmy剩餘額度`,jimmy)
jimmy剩餘額度 [`jimmy`, [`saving`, 5000]]

 

 end~

****** 幾米花的Python ****** 部落格主頁:https://www.cnblogs.com/jimmy-share/  歡迎轉載 ~

相關文章