python dict 字典詳解

和列表相同,字典也是許多數據的集合,屬於可變序列類型。不一樣之處在於,它是無序的可變序列,其保存的內容是以「鍵值對」的形式存放的。java

字典中,習慣將各元素對應的索引稱爲鍵(key),各個鍵對應的元素稱爲值(value),鍵及其關聯的值稱爲「鍵值對」。

字典類型很像學生時代經常使用的新華字典。咱們知道,經過新華字典中的音節表,能夠快速找到想要查找的漢字。其中,字典裏的音節表就至關於字典類型中的鍵,而鍵對應的漢字則至關於值。python

 

表 1 Python 字典特徵
主要特徵 解釋
經過鍵而不是經過索引來讀取元素 字典類型有時也稱爲關聯數組或者散列表(hash)。它是經過鍵將一系列的值聯繫起來的,這樣就能夠經過鍵從字典中獲取指定項,但不能經過索引來獲取。
字典是任意數據類型的無序集合 和列表、元組不一樣,一般會將索引值 0 對應的元素稱爲第一個元素。而字典中的元素是無序的。
字典是可變的,而且能夠任意嵌套 字典能夠在原處增加或者縮短(無需生成一個副本),而且它支持任意深度的嵌套,即字典存儲的值也能夠是列表或其它的字典。
字典中的鍵必須惟一 字典中,不支持同一個鍵出現屢次,不然,只會保留最後一個鍵值對。
字典中的鍵必須不可變 字典中的值是不可變的,只能使用數字、字符串或者元組,不能使用列表。

Python 中的字典類型至關於 Java 或者 C++ 中的 Map 對象。數組

 

1) 花括號語法建立字典

於字典中每一個元素都包含 2 部分,分別是鍵和值,所以在建立字典時,鍵和值之間使用冒號分隔,相鄰元素之間使用逗號分隔,全部元素放在大括號 {} 中。

Python 字典類型的語法格式以下:ssh

key: valuen 表示各個元素的鍵值對。須要注意的是,同一字典中各個元素的鍵值必須惟一。函數

dictname = {'key':'value1','key2':'value2',...,'keyn':valuen}

 

 

[root@kube dict]# cat demo.py 
#coding:utf-8

scores = {'語文':89,'數學':100,'化學':90}
print(type(scores))
a_scores = {'語文':89,'數學':(44,55),'化學':[90,66]}          #key 鍵不能是列表會報錯
print(a_scores)


[root@kube dict]# py demo.py 
<class 'dict'>
{'語文': 89, '數學': (44, 55), '化學': [90, 66]}
[root@kube dict]# 

 

 

2) 經過 fromkeys() 方法建立字典

Python 中,還可使用 dict 字典類型提供的 fromkeys() 方法建立全部鍵值爲空的字典,使用此方法的語法格式爲:ui

dictname = dict.fromkeys(list,value=None)
[root@kube dict]# cat demo1.py 
s_name = {'語文','數學','英語'}
scores = dict.fromkeys(s_name)
print(type(scores))
print(scores)
[root@kube dict]# py demo1.py 
<class 'dict'>
{'數學': None, '英語': None, '語文': None}
[root@kube dict]#

3) 經過 dict() 映射函數建立字典

經過 dict() 函數建立字典的寫法有多種,表 2 羅列出了經常使用的幾種方式,它們建立的都是同一個字典 a。spa

表 2 dict() 函數建立字典
建立格式 注意事項
>>> a = dict(one=1,two=2,three=3) 注意,其中的 one、two、three 都是字符串,但使用此方式建立字典時,字符串不能帶引號。
>>> demo = [('two',2),('one',1),('three',3)] #方式1
>>> demo = [['two',2],['one',1],['three',3]] #方式2
>>> demo = (('two',2),('one',1),('three',3)) #方式3
>>> demo = (['two',2],['one',1],['three',3]) #方式4
>>> a = dict(demo)
向 dict() 函數傳入列表或元組,而它們中的元素又各自是包含 2 個元素的列表或元組,其中第一個元素做爲鍵,第二個元素做爲值。
>>> demokeys = ['one','two','three'] #還能夠是字符串或元組
>>> demovalues = [1,2,3] #還能夠是字符串或元組
>>> a = dict(zip(demokeys,demovalues))
經過應用 dict() 函數和 zip() 函數,可將前兩個列表轉換爲對應的字典。

注意,不管採用以上哪一種方式建立字典,字典中各元素的鍵都只能是字符串、元組或數字,不能是列表。.net

 

python 訪問字典

和列表、元組不一樣,它們訪問元素都是經過下標,而字典不一樣,它是經過鍵來訪問對應的元素值。code

由於字典中元素是無序的,因此不能像列表、元組那樣,採用切片的方式一次性訪問多個元素。

Python 更推薦使用 dict 類型提供的 get() 方法獲取指定鍵的值。get() 方法的語法格式爲:orm

dict.get(key[,default])
[root@kube dict]# cat demo1.py 
scores = {'語文':60,'數學':70,'英語':80}
print(scores.get('語文'))
print(scores.get('英語'))     #經過get 函數獲取值
del scores                   #del 刪除字典
print(scores)

[root@kube dict]# py demo1.py 
60
80
Traceback (most recent call last):
  File "demo1.py", line 5, in <module>
    print(scores)
NameError: name 'scores' is not defined
[root@kube dict]# 

python  dict 字典基本操做

因爲字典屬於可變序列,因此咱們能夠任意操做字典中的鍵值對(key-value 對)。Python 中,常見的字典操做有如下幾種:

    1. 向現有字典中添加新的鍵值對。
    2. 修改現有字典中的鍵值對。
    3. 從現有字典中刪除指定的鍵值對。
    4. 判斷現有字典中是否存在指定的鍵值對。

Python字典添加鍵值對

若是要爲 dict 添加鍵值對,只需爲不存在的 key 賦值便可。實現此操做的語法格式以下:
dict[key] = value 

 

表 1 Python 字典添加鍵值對語法參數
參數 含義
dict 表示字典名稱。
key 表示要添加元素的鍵。注意,既然是添加新的元素,那麼就要保證此元素的鍵和字典中現有元素的鍵互不相同。
value 表示要添加數據的值,只要是 Python 支持的數據類型就能夠。

 

[root@kube dict]# cat demo2.py 
a = dict()             #用 duict 函數定義一個空的字典
print(a)
print(type(a))          
a['語文'] = 100          #定義字典中的 key  值並給定 value ,至關於字典添加鍵值對
a['數學'] = 80
a['地理'] = 90
print(a)
a['語文'] = 88888         #給 相同key  從新賦值至關於修改 key 的value 
print(a)
del a['地理']              #刪除對應的 key  ,同時也刪除 key  對應的 value
print(a)

[root@kube dict]# py demo2.py 
{}
<class 'dict'>
{'語文': 100, '數學': 80, '地理': 90}
{'語文': 88888, '數學': 80, '地理': 90}
{'語文': 88888, '數學': 80}
[root@kube dict]# 

 

 

python 字典dict 徹底攻略

字典的數據類型爲 dict,咱們可以使用 dir(dict) 來查看該類包含哪些方法

>>> dir(dict)
['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
>>> 

 

 

python keys() ,values() ,items() 函數

這 3 個方法之因此放在一塊兒介紹,是由於它們都用來獲取字典中的特定數據。keys() 方法用於返回字典中的全部鍵;values() 方法用於返回字典中全部鍵對應的值;items() 用於返回字典中全部的鍵值對。

[root@kube dict]# cat demo3.py 
scores = {'語文':60,'數學':70,'英語':80}

print(scores.keys())
print(scores.values())
print(scores.items())
[root@kube dict]# py demo3.py 
dict_keys(['語文', '數學', '英語'])
dict_values([60, 70, 80])
dict_items([('語文', 60), ('數學', 70), ('英語', 80)])
[root@kube dict]# 

 

[root@kube dict]# 
[root@kube dict]# cat  demo4.py 
a = {'數學': 95, '語文': 89, '英語': 90}
for k in a.keys():
    print(k,end=' ')
print("\n---------------")
for v in a.values():
    print(v,end=' ')
print("\n---------------")
for k,v in a.items():
    print("key:",k," value:",v)
[root@kube dict]# py demo4.py 
數學 語文 英語 
---------------
95 89 90 
---------------
key: 數學  value: 95
key: 語文  value: 89
key: 英語  value: 90
[root@kube dict]# 

 

 

python  copy 方法

copy() 方法用於返回一個具備相同鍵值對的新字典

[root@kube dict]# cat demo5.py 
a = {'one':1,'two':2,'three':[3,2,1]}
b = a.copy()
print(b)
[root@kube dict]# py demo5.py 
{'one': 1, 'two': 2, 'three': [3, 2, 1]}
[root@kube dict]# 
注意,copy() 方法所遵循的拷貝原理,既有深拷貝,也有淺拷貝。拿拷貝字典 a 爲例,copy() 方法只會對最表層的鍵值對進行深拷貝,也就是說,它會再申請一塊內存用來存放 {'one': 1, 'two': 2, 'three': []};而對於某些列表類型的值來講,此方法對其作的是淺拷貝,也就是說,b 中的 [1,2,3] 的值不是本身獨有,而是和 a 共有。

 

 

python update 方法

update() 方法可以使用一個字典所包含的鍵值對來更新己有的字典。

在執行 update() 方法時,若是被更新的字典中己包含對應的鍵值對,那麼原 value 會被覆蓋;若是被更新的字典中不包含對應的鍵值對,則該鍵值對被添加進去。

[root@kube dict]# cat demo6.py 
a = {'one':1,'two':2}
a.update({'one':5.5,'three':3.3})
print(a)
[root@kube dict]# py demo6.py 
{'one': 5.5, 'two': 2, 'three': 3.3}
[root@kube dict]# 

 

python pop() 方法

[root@kube dict]# cat demo7.py 
a = {'one': 1, 'two': 2, 'three': 3}
print(a.pop('one'))
print(a)
[root@kube dict]# py demo7.py 
1
{'two': 2, 'three': 3}
[root@kube dict]# 

 

python popitem() 方法

popitem() 方法用於隨機彈出字典中的一個鍵值對。

注意,此處的隨機實際上是假的,它和 list.pop() 方法同樣,也是彈出字典中最後一個鍵值對。但因爲字典存儲鍵值對的順序是不可知的,所以 popitem() 方法老是彈出底層存儲的最後一個鍵值對。

[root@kube dict]# cat demo7.py 
a = {'one': 1, 'two': 2, 'three': 3}
print(a.popitem())
print(a)
print(a.popitem())
print(a)
[root@kube dict]# py demo7.py 
('three', 3)
{'one': 1, 'two': 2}
('two', 2)
{'one': 1}
[root@kube dict]# 

 

python setdefault() 方法

setdefault() 方法也用於根據 key 來獲取對應 value 的值。但該方法有一個額外的功能,即當程序要獲取的 key 在字典中不存在時,該方法會先爲這個不存在的 key 設置一個默認的 value,而後再返回該 key 對應的 value。

也就是說,setdefault() 方法總能返回指定 key 對應的 value;若是該鍵值對存在,則直接返回該 key 對應的 value;若是該鍵值對不存在,則先爲該 key 設置默認的 value,而後再返回該 key 對應的 value。

 

[root@kube dict]# cat demo7.py 
a = {'one': 1, 'two': 2, 'three': 3}
print(a.setdefault('four'))                 #添加four 不存在的鍵,value默認 None
print(a)
print(a.setdefault('five',2.3))              #添加不存在的鍵值對,會添加
print(a)
print(a.setdefault('one',5.5))                #添加已存在的鍵值,不會添加
print(a)


[root@kube dict]# py demo7.py 
None
{'one': 1, 'two': 2, 'three': 3, 'four': None}
2.3
{'one': 1, 'two': 2, 'three': 3, 'four': None, 'five': 2.3}
1
{'one': 1, 'two': 2, 'three': 3, 'four': None, 'five': 2.3}
[root@kube dict]# 

 

 

python 使用字典格式化字符串

格式化字符串時,若是要格式化的字符串模板中包含多個變量,後面就須要按順序給出多個變量,這種方式對於字符串模板中包含少許變量的情形是合適的,但若是字符串模板中包含大量變量,這種按順序提供變量的方式則有些不合適。

這時,就可使用字典對字符串進行格式化輸出,具體方法是:在字符串模板中按 key 指定變量,而後經過字典爲字符串模板中的 key 設置值。

 

[root@kube dict]# cat demo8.py 
#coding:utf-8
#定義字符串模板的轉化說明符

temp = '姓名:%(name)s,年齡:%(age)3.0f,籍貫:%(location)s'

msg = {'name': 'JoJ','age':23,'location':'海拉爾羣島'}
print(temp % msg)
[root@kube dict]# py demo8.py 
姓名:JoJ,年齡: 23,籍貫:海拉爾羣島
[root@kube dict]# 
相關文章
相關標籤/搜索