python教程(七)·字典

本文介紹本系列教程最後一個數據結構——字典
python


在現實生活中,查英語字典的時候,咱們一般根據單詞來查找意思。而python中的字典也是相似的,根據特定的 「鍵」(單詞)來查找 「值」(意思)。git

字典的基本使用

下面以電話簿爲例,咱們的電話簿記錄的是電話號碼。當要查找電話號碼時,咱們根據人名來查找其電話號碼,因此人名就是字典的鍵,電話號碼就是字典的值。假設有下面這樣的人名和電話號碼的電話簿:數據結構

人名=>電話
Aganzo=>1230
Jack=>0221
Lee=>1354
Emilie=>2479

建立字典

如今咱們來建立一個字典來表示這個電話簿:app

>>> phonebook={'Aganzo':'1230', 'Jack':'0221', 'Lee':'1354', 'Emilie':'2479'}
>>> phonebook
{'Aganzo': '1230', 'Jack': '0221', 'Lee': '1354', 'Emilie': '2479'}
>>>

從上面能夠看出,建立字典的基本格式爲{ 鍵1:值1, 鍵2:值2, 鍵3:值3 ...}。除了這種方法,咱們還能夠經過dict函數傳遞關鍵字參數來建立字典,像下面這樣:函數

>>> phonebook = dict(Aganzo='1230', Jack='0221', Lee='1354', Emilie='2479') # 關鍵字參數就是字典的鍵,參數值就是字典的值
>>> phonebook
{'Aganzo': '1230', 'Jack': '0221', 'Lee': '1354', 'Emilie': '2479'}
>>>

咱們經常使用第一種方式建立字典,第二種方式比較少用,並且第二種方式有一個缺點:由於關鍵字參數會變爲字典的鍵,因此鍵必須符合參數的命名規則(字母或下劃線_開頭,其後是數字、字母或下劃線)。學習

補充:建立空字典有兩種方法,一種是直接使用{};另外一種是調用dict函數時,參數留空,即dict();像鍵:值這樣的東西叫作字典的 「項」.net

字典基本操做

字典的基本操做有:code

先來講「查」:咱們能夠經過名字來查找電話簿中的電話號碼,在字典中相似這樣,經過「鍵」來查「值」,基本格式爲字典[鍵]對象

>>> phonebook['Aganzo']
'1230'
>>> phonebook['Jack']
'0221'
>>> phonebook['Lily']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Lily'
>>>

從上面的代碼能夠看出,咱們的「電話簿」中不存在Lily的電話號碼,可知,當字典中不存在要查的元素時,python會提示報錯。咱們能夠在查以前確認字典中是否有對應的項,使用成員運算符inblog

>>> 'Lily' in phonebook # 不存在
False
>>> 'Jack' in phonebook # 存在
True
>>>

或者查看「電話簿」中全部人的電話號碼:

>>> for key in phonebook:
...     print('%s=>%s' % (key, phonebook[key]))
... 
Aganzo=>1230
Jack=>0221
Lee=>1354
Emilie=>2479
>>>

再來講「改」:此時得知Lee更換了電話號碼爲112233,須要對電話簿進行更改,使用以下代碼:

>>> phonebook['Lee'] = '112233'
>>> phonebook
{'Aganzo': '1230', 'Jack': '0221', 'Lee': '112233', 'Emilie': '2479'}
>>>

再到「增」:假設新認識了一位朋友Zieg,獲得了朋友的電話號碼爲123456,須要在「電話簿」中新增一項,和「改」操做同樣,使用賦值運算符=

>>> phonebook['Zieg'] = '123456'
>>> phonebook
{'Aganzo': '1230', 'Jack': '0221', 'Lee': '112233', 'Emilie': '2479', 'Zieg': '123456'}
>>>

最後說「刪」:朋友Jack與你絕交了(世事無常╮(╯▽╰)╭),你決定刪除他的聯繫方式,此時你狠心地運行了下面的代碼:

>>> del phonebook['Jack']
>>> phonebook
{'Aganzo': '1230', 'Lee': '112233', 'Emilie': '2479', 'Zieg': '123456'}
>>>

「電話簿」中再也沒有了Jack的電話號碼……

小結

好了,一個簡單的示例事後,相信你們能理解字典的使用方法了,讓咱們來一個小小的總結:

建立字典的方法:

  • 經過花括號建立 x = {鍵1:值1, 鍵2:值2, 鍵3:值3 ...}
  • 經過dict函數建立 x = dict(key1=value1, key2=value2, key3=value3 ...)
  • 建立空字典可使用 x = {}x = dict()

字典的基本操做:

  • 增:x['abc'] = 123 (鍵'abc'不存在)
  • 刪:del x['abc']
  • 改:x['abc] += 1x['abc'] = 2x['abc'] *= 10……(鍵'abc'存在)
  • 查:result = x['abc']print(x['abc'])……(鍵'abc'存在)

補充:字典的用法和列表相似,只不過列表索引元素的時候使用的是數字做鍵,而字典大多數時候使用字符串索引元素。


關於字典的鍵,還有一點是要說清楚的:前面咱們使用字典的時候都是使用了字符串類型的鍵,可我沒有說字典的鍵只能是字符串!

實際上,字典的鍵能夠是任意的不可變類型,如:字符串(最經常使用)、元組、浮點數、整數。


字典方法

字典也是對象,和列表同樣,字典也提供了一些實用的方法,下面是介紹

clear

clear方法用於清空字典中的全部項:

>>> d = {'name':'feather', 'age':18}
>>> d
{'name': 'feather', 'age': 18}
>>> d.clear()
>>> d
{}
>>>

這個方法是原地的操做,意思就是操做對象是在字典自己,這和直接將變量賦值爲空字典是不同的,從下面的例子能夠看出:

>>> x = {'a':1}
>>> y = x # y變量引用的字典和x變量引用的是同一個字典
>>> x = {} # 將x變量引用改成另外一個字典,這個字典是空字典
>>> x
{}
>>> y # y變量引用的字典沒有被改變
{'a': 1}
>>>

copy

copy方法用於返回一個新字典,這個新字典和原來的字典擁有相同的項:

>>> x = {'name':'feather', 'blog':['https://blog.csdn.net/lonely_feather', 'https://featherl.gitee.io/']}
>>> y = x.copy()
>>> y['name'] = 'Lee'
>>> y['blog'].append('https://www.cnblogs.com/featherl/') 
>>> x
{'name': 'feather', 'blog': ['https://blog.csdn.net/lonely_feather', 'https://featherl.gitee.io/', 'https://www.cnblogs.com/featherl/']}
>>> y
{'name': 'Lee', 'blog': ['https://blog.csdn.net/lonely_feather', 'https://featherl.gitee.io/', 'https://www.cnblogs.com/featherl/']}
>>>

能夠看到,y字典是從x複製而來的,因此改變y字典的鍵爲'name'的項的時候並不影響x字典,要注意的是,y['blog'].append('https://www.cnblogs.com/featherl/')這句代碼不屬於修改y字典,這是修改y字典的鍵爲'blog'的項引用的列表,而y字典和x字典的'blog'項引用的是同一個列表(由於y字典的項是從x字典中複製而來的),因此修改這個列表的時候,在x和y兩個字典上均可以看到效果。

這種問題是由於copy方法是「淺複製」,copy方法僅僅把相同的值存儲到了一個新的字典裏,要想避免這種問題,須要使用「深複製」,可使用copy模塊的deepcopy函數來實現:

>>> from copy import deepcopy
>>> x = {'list':[1,2,3]}
>>> y = deepcopy(x)
>>> y['list'].append(4)
>>> x
{'list': [1, 2, 3]}
>>> y
{'list': [1, 2, 3, 4]}
>>>

fromkeys

fromkeys方法用給定的鍵建立新字典,每一個鍵對應的默認值都爲None:

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

上面代碼的第一個例子中,咱們建立了一個空字典,而後使用這個空字典的fromkeys方法建立了一個新字典,第二個例子中,咱們直接使用dict這個類(實際上dict不是函數,是一個「類」)的fromkeys方法建立新字典。

咱們還能夠本身設置默認值:

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

get

get方法使用給定的鍵訪問字典中的項,不過,若是字典中不存在該項時,get方法返回默認值None,而不是報錯:

>>> x = {'name':'Lee'}
>>> x.get('age')
>>> print(x.get('name'))
Lee
>>> print(x.get('age'))
None

一樣的,這個默認值也是能夠本身設定的:

>>> x = {'name':'Lee'}
>>> x.get('age', '???')
'???'

update

update方法將一個新字典合併到當前字典,當存在相同的鍵,用新字典的值進行覆蓋:

>>> x = {'name':'Lee'}
>>> x = {'name':'Lee', 'blog':'https://featherl.gitee.io'}
>>> y = {'name':'feather', 'age':18}
>>> x.update(y)
>>> x
{'name': 'feather', 'blog': 'https://featherl.gitee.io', 'age': 18}

pop

pop方法用來返回指定鍵的項,並將該項從字典中移除:

>>> x = {1:1, 2:2, 3:3}
>>> x.pop(1)
1
>>> x
{2: 2, 3: 3}

上面的例子同時也證實了字典的鍵不必定是字符串。

popitem

popitem方法隨機挑選一個項返回,並刪除這個項。字典不一樣於列表,字典的項是沒有順序,不一樣的機器或者不一樣版本的python,其字典存儲項的順序多是不同的,故popitem方法具體處理哪一項是無法預測的。

使用舉例以下:

>>> x = {1:1, 2:2, 3:3}
>>> x.pop
x.pop(      x.popitem(  
>>> help(x.popitem)

>>> x.popitem()
(3, 3)
>>> x.popitem()
(2, 2)
>>> x.popitem()
(1, 1)
>>> x.popitem()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'popitem(): dictionary is empty'

當字典爲空的時候,該方法拋出錯誤。

items

items方法返回字典的全部的項,每一個項爲一個形式爲(key, value)的元組,返回的類型是一種相似列表的類型,可使用for循環迭代,可是沒有列表的方法,最好先使用list轉換成列表:

>>> x = {'name':'Lee', 'age':18}
>>> x.items()
dict_items([('name', 'Lee'), ('age', 18)])
>>> list(x.items())  # 轉換成列表
[('name', 'Lee'), ('age', 18)]

注意:在python2中此方法還有後面的keys、values方法返回的就是列表類型,不過咱們學的是python3,要注意區分。

相似items的方法還有:

  • keys方法返回字典的全部的鍵(相似列表的類型)
  • values方法返回字典的全部的值(相似列表的類型)

到此爲止,本系列教程的python數據結構已經介紹完了,在本系列教程只是介紹了python中如何使用經常使用數據結構,並無講實現原理。而數據結構在計算機領域是不可或缺的,但願對數據結構瞭解甚少的讀者能夠認真學習一下數據結構的相關知識。

等學習完文件操做後,咱們將用一個小項目實踐一下(其實忽略文件操做,目前學到的知識仍是能夠作不少東西的),敬請期待! ( ̄︶ ̄)↗

相關文章
相關標籤/搜索