1. 程式人生 > >[Python]第四章 字典——當索引行不通時

[Python]第四章 字典——當索引行不通時

文章目錄


對映:通過名稱來訪問其各個值的資料結構。
字典: Python中唯一的內建對映型別,其中的值不按順序排列,而是儲存在鍵下。鍵可能是數、字串或元組。

4.1 字典的用途

 表示棋盤的狀態,其中每個鍵都是由座標組成的元組;
 儲存檔案修改時間,其中的鍵為檔名;
 數字電話/地址簿。
列表建立資料庫

>>>names=['jack','allen','amy','ken']
>>>numbers=['2546','4568','7892','2537']
>>>numbers[names.index('allen')]
'4568'

字典建立資料庫

>>>phonebooks={'jack':'2546','allen':'4568','amy':'7892','ken':'2537'}
>>>phonebooks['allen']
'4568'

4.2 建立和使用字典 字典名={鍵:值,鍵:值,……}

這種鍵值對稱為項(item)。每個鍵與其值之間都用冒號(:)分隔,項之間用逗號分隔,而整個字典放在花括號內。
空字典(沒有任何項)用兩個花括號表示,類似於下面這樣:{}
鍵必須是獨一無二的,而字典中的值無需如此。

4.2.1 函式dict

從鍵值對序列建立:

>>> items = [('name', 'Gumby'), ('age', 42)]  
#鍵值對序列,每個子序列只有兩個元素分別作為字典的鍵和值
>>> d = dict(items)
>>> d
{'age': 42, 'name': 'Gumby'}

關鍵字實參建立:

>>> d = dict(name='Gumby', age=42)
>>> d
{'age': 42, 'name': 'Gumby'}

從其他對映建立:
可不使用dict函式,而是使用copy函式

4.2.2 基本的字典操作

與序列相同之處:
len(d)返回字典d包含的項(鍵值對)數。

>>> d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>> len(d)
3

d[k]返回與鍵k相關聯的值。

>>>d['age']
>>>42

d[k] = v將值v關聯到鍵k

>>>d['age'] = 12
>>>d
{'name': 'Gumby', 'age': 12, 'sex': 'male'}

del d[k]刪除鍵為k的項

>>>del d['age']
>>>d
{'name': 'Gumby', 'sex': 'male'}

k in d檢查字典d是否包含鍵為k的項

>>>'name' in d
True

與序列不同之處:
鍵的型別:字典中的鍵可以是任何不可變的型別,如浮點數(實數)、字串或元組。

>>>d = {('name'): 'Gumby', (33,14): 42, 77: 'male'}

>>>x=[None]*5
>>>x[3]='andy'
>>>x
[None, None, None, 'andy', None]
>>>y={}
>>>y[3]='andy'
>>>y
{3: 'andy'}

自動新增:即便是字典中原本沒有的鍵,也可以給它賦值,序列需要append等方法(序列不可以)

>>>d={'name': 'Gumby', 'sex': 'male'}
>>>d['age']=55
>>>d
{'name': 'Gumby', 'sex': 'male', 'age': 55}

成員資格:表示式k in D(其中D是一個字典)查詢的k是鍵而不是值,序列中成員資格 v in l查詢的v是值不是索引

>>>d={'v':55,'dd':11,'as':87}
>>>'dd' in d
True

CASE:字典的多重索引

>>>people={
  	  'jack':{'phone':'2546','sex':'male'},
   	  'allen':{'phone':'4568','sex':'male'},
  	  'amy':{'phone':'7892','sex':'female'},
  	  'ken':{'phone':'2537','sex':'male'}
	}
>>>people['allen']
{'phone': '4568', 'sex': 'male'}
>>>people['allen']['sex']
'male'

在這裡插入圖片描述

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

>>>phonebook={'jack':'2546','allen':'4568','amy':'7892','ken':'2537'}
>>>"his number is {allen}".format_map(phonebook)
'his number is 4568'

Notice:{}裡面沒有引號,因此只適用原字典中的key只能是帶引號的字串

>>>template =
 '''<html>
<head>
<title>{title}</title>
</head>
<body>
<h1>{title}</h1>
<p>{text}</p>
</body>
</html>'''
>>>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>
</html>

4.2.4 字典方法 .方法()

1. clear方法

D.clear()刪除所有字典項,無返回

>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d.clear()
>>>d
{}

>>> x = {}
>>> c = x
>>> x['key'] = 'value'
>>> c #賦值方法,都指向同一個字典
{'key': 'value'}
>>> x = {}#空字典賦值對c沒影響  |>>> x.clear()#刪除原來字典元素
>>> c	   				 	   |>>>c
{'key': 'value'}               | {}#c也會隨著原字典的刪除而刪除
2. copy方法

X.copy()返回一個鍵值對與X字典相同新字典
淺複製,值本身是原件,非副本

>>> x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>> c = x.copy()
>>> c['username'] = 'mlh'       #'='替換拷貝值,原件不受影響   
>>> c['machines'].remove('bar')   #修改拷貝值,原件受影響
#append也是修改,'='賦值替換
>>> c
{'username': 'mlh', 'machines': ['foo', 'baz']}
>>> x  #'='替換不影響原件
{'username': 'admin', 'machines': ['foo', 'baz']}

Notice:替換原件值,拷貝件不受影響;修改原件值,拷貝件受影響

深複製Deepcopy(D)

>>>from copy import deepcopy
>>>x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>>yc=deepcopy(x)
>>>yc['username'] = 'mlh'     #替換複製值,原件不受影響
>>>yc['machines'].append('car') #修改複製值,原件不受影響
>>>x                       
{'username': 'admin', 'machines': ['foo', 'bar', 'baz']}

Notice:替換和修改原件,複製件都不受影響

3. fromkeys方法

{ }/dict.fromkeys(list,(v)) 從指定列表list的元素作為鍵建立一個新字典,值都是預設None或者指定的v
新建空字典後用fromkeys建立另一個字典

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

用dict類呼叫fromkeys方法直接建立一個新字典

>>> dict.fromkeys(['name', 'age'], '(unknown)')
{'age': '(unknown)', 'name': '(unknown)'}
4. get方法

D.get(x,y) 從字典D查詢x對應的值,當訪問字典D中沒有的項x不會報錯,會返回指定值y(y只是返回值,不同於setdefault,沒有修改原值的能力)
正常情況下訪問存在的指定鍵對應的值

>>>x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>>x.get('username')
'admin'

正常有值可返的情況下,即使設定了y也不會產生影響本應返回的值

>>>x.get('username','jack')
'admin'#不會對原值有任何影響,如果非要改變原值,需要用到修改值的方法
>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d.get('name').replace('by','lili')
'Gumlili'

當訪問的項不存在時,普通方法會報錯
Get方法訪問不存在的項是則不會報錯

>>>x = {'username': 'admin', 'machines': ['foo', 'bar', 'baz']}
>>>x['sex']
報錯
>>>x.get(‘sex’)
不報錯

也可以指定返回值,不指定是預設None

>>>x.get('sex','not found')
'not found'
>>>y=x.get('sex')
>>>print(y)
None

CASE
在這裡插入圖片描述
Notice:people.get(name,{}).get(key,’not found’)
這裡的get(name,{})花括號不能省略,因為當name輸入people中的姓名時,返回的是改姓名對應的的子字典,如Jack對應的{‘phone’:‘2546’,‘sex’:‘male’},但是輸入的名字如果不是people裡面的,預設返回none,然而後面跟著的get(key,’not found’)限制了其前面返回的一定是個字典而不能是個none,因此花括號表示空列表不能省略

5. items方法

D.items()返回一個包含所有字典項的列表,其中每個元素都為(key, value)的形式。字典項在列表中的排列順序不確定。

>>> d = {'title': 'Python Web Site', 'url': 'http://www.python.org', 'spam': 0}
>>> d.items()
dict_items([('url', 'http://www.python.org'), 
('spam', 0), 
('title', 'Python Web Site')])

>>> type(d.items())
dict_items # 型別:字典檢視(可用於迭代)

確定長度

>>>len(d.items())
3

檢查成員資格

>>> ('spam', 0) in d.items()
True

不復制是檢視的有點,始終是底層字典的反映

>>> d['spam'] = 1  
>>> ('spam', 0) in d.items()
False
>>> ('spam', 1) in d.items()
True

將字典項複製到列表

>>> list(d.items())
[('spam', 0), ('title', 'Python Web Site'), ('url', 'http://www.python.org')]
6. keys方法

D.keys()返回一個字典檢視,其中包含指定字典中的鍵

>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d.keys()
dict_keys(['name', 'age', 'sex'])
>>>type(d.keys())
dict_keys  型別:字典檢視
7. pop方法

D.pop(x) 從字典D中刪除指定鍵x對應的鍵值對,並返回該鍵對應的值

>>> d = {'x': 1, 'y': 2}
>>> d.pop('x')
1
>>> d
{'y': 2}
8. popitem方法

D.popitem() 隨機刪除一個鍵值對
由於字典是無序的,因此不像list.pop方法刪除最後一個,該方法隨機刪除

>>> d = {'url': 'http://www.python.org', 'spam': 0, 'title': 'Python Web Site'}
>>> d.popitem()
('url', 'http://www.python.org')
>>> d
{'spam': 0, 'title': 'Python Web Site'}
9. setdefault方法

類似get方法,D.setdefault(x)/(x,)/(x,[]) 從字典D查詢並返回x對應的值,如果沒有找到,則不返回,也可以設定兩個引數,D.setdefault(x,y)則把x:y這一項新增到原字典中,返回y.而get方法不改變原字典,只返回設定值
如果字典中包含有給定鍵,則返回該鍵對應的值,否則返回為該鍵設定的值。

>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d.setdefault('salary',5000)
5000
>>>d
{'name': 'Gumby', 'age': 42, 'sex': 'male', 'salary': 5000}#原字典更新

>>>d.get('grade',5)
5
>>>d
{'name': 'Gumby', 'age': 42, 'sex': 'male', 'salary': 5000}#沒有改變之前的字典

>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d.setdefault('age',50)
50
>>>d
{'name': 'Gumby', 'age': 42, 'sex': 'male'}#沒有改變原值,但是如果直接賦值則會改變
>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d[‘age’]=50
>>>d
{'name': 'Gumby', 'age': 50, 'sex': 'male'}#沒有改變原值,但是如果直接賦值則會改變

Notice:m=D.setdefault(x,y)這個表示式整體返回的是y,y是什麼,m就是什麼

>>>m={'age':5}.setdefault('name','jack')
>>>m
'jack'
10. update方法

D.update(x) 將x子字典新增/替換原來字典D中的項

>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>x={'age':88,'grade':2}
>>>d.update(x)
>>>d
{'name': 'Gumby', 'age': 88, 'sex': 'male', 'grade': 2}

也可以像使用dict函式一樣使用update,傳入一個對映、一個由鍵值對組成的序列(其他可迭代物件)或關鍵字引數。

>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>x=[('age',88),('grade',2)]#傳入一個鍵值對序列
>>>d.update(x)
>>>d
{'name': 'Gumby', 'age': 88, 'sex': 'male', 'grade': 2}
>>>d = {'name': 'Gumby', 'age': 42, 'sex': 'male'}
>>>d.update(age=88,grade=2)#傳入關鍵字引數
>>>d
{'name': 'Gumby', 'age': 88, 'sex': 'male', 'grade': 2}
  1. values D.values()返回一個字典檢視,其中包含指定字典中的值
>>>d={}
···d[1]='a'
···d[2]='b'
···d[3]='c'
···d[4]='d'
>>>d.values()
dict_values(['a', 'b', 'c', 'd'])