Python 基礎起步 (七) 初識字典 Dictionary(絕命毒師前傳)

alpha94511發表於2019-01-27

大家好,我是小白,書接上回,我們目前已經瞭解到了Python中很常見的一種資料型別:List,也初步掌握了一些Python自帶的有關List的方法,今天為大家介紹另外一種異常火爆的資料結構:字典Dictionary,不誇張的講,基本上我們熟悉了列表和字典後有關資料結構這裡就差不多啦,實際的專案中應用的最多的也是這兩種,至於其他的Set,Tuple平時用的不多~

字典到底是什麼

簡單來說,字典是另一種可變資料型別,且可儲存任意型別物件。就是說字典裡面儲存的值我們可以修改~
字典的每個鍵值(key=>value)對用冒號(:)分割,每個對之間用逗號(,)分割,整個字典包括在花括號({})中 ,格式如下所示:

d = {                    #這裡d的結構就是一個字典
    <key>: <value>,      #基礎的資料結構就是一個key=>value
    <key>: <value>,
      .
      .
      .
    <key>: <value>
}

鍵必須是唯一的,但值則不必。值可以取任何資料型別,我會在接下來用詳細的例子詳細解釋。
如果我們要把字典和列表做一個對比總結的話,可以發現如下特點:

  • 列表和字典的值都可以被修改
  • 列表和字典都是動態結構,也就是說可以任意插入值,無限擴充套件
  • 列表中獲取值的方式是通過Index(索引)
  • 字典中獲取值是通過key(鍵)
  • 列表字典都可以層次巢狀,比如一個列表中的值可以是另一個列表,

好啦,讓我們現在開始今天的栗子吧~

Dictionary字典常用方法(內含扎心舉例):

建立一個字典

首先,不知道有沒有小白朋友們感到疑惑,既然已經有列表了,為啥還需要字典這種資料結構 ?原因很簡單哈哈,出於實際需要,我來舉個令人傷心的例子說明:

你是北京知名985,211畢業的北漂有為青年xiaobai,躲過了這輪網際網路寒冬,23歲的你每天最愛穿著格子衫去街角咖啡廳點一杯可以無限續杯的伯爵紅茶,順便打量著周圍45度仰臉拍抖音的小姐姐,意淫著一些不可告人的事情,這時來了一個青春無比的妹子,交談甚歡後,同為北漂的她得知你技術入股進入一家創業公司,以及老闆忽悠你的超級大餅和期權,內心狂喜,碰到潛力股了呀,程式猿呀,技術入股呀 !而你以多年老司機經驗用餘光掃描了妹子的三圍,得出結論大概是82,62,82後,立刻邀請她去廁所做了一些羞羞的事情( 此處省略 6秒 ),幾個月後迅速結婚然後生了一個醜萌的孩子...

好啦,請你把這段經歷用列表來表示一下 ? WTF! 答案几乎不可能,但是用字典的話某種程度上會解釋的清楚一些~ 哈哈
如果用列表,就只能這麼表示:

young_man = ['xiaobai',985,23,'Developper'.......]

完全不懂在說啥呀...但是如果用字典會舒服的多:

     young_man = {'first_name':'bai',
                  'family_name':'xiao',
                  'age':23,
                  'city':'Beijing',
                  'university_rank':'985',
                  'university_name':'beida',
                  'job':'Developer',
                  'salary':20000.00,
                  'company':'Start Up',
                  'married':True,
                  'wife_measurements':[82,62,82],
                  'number_of_children':1,
                  'future':None
                 }

瞬間感覺資訊量暴漲有木有 ! 其實當我最開始接觸字典的時候,我對它的第一感覺是經過select語句從資料庫查詢出的一個結果哈哈~, 好啦,讓我們檢視一下我們建立的這個字典:

print(young_man)
Out:    {'first_name': 'bai',
         'family_name': 'xiao',
         'age': 23,
         'city': 'Beijing',
         'university_rank': '985',
         'university_name': 'beida',
         'job': 'Developer',
         'salary': 20000.00,
         'company': 'Start Up',
         'married': True,
         'wife_measurements': [82, 62, 82],
         'number_of_children': 1,
         'future': None}

大家可以發現輸出的格式和建立的格式基本一樣,都是符合上面我們提到過的key=>value 的形式,這裡我們建立了一個字典並把字典的值賦給變數young_man,幾點需要大家注意:

  • 字典的鍵是唯一的,型別也可以為int,我這個例子都是str型別,但是基本int型別的極少
  • 在'university_name':'985' 這組資訊中985是字元型,但是底下"number_of_children"的值為1,1是int型
  • 字典的值可以是一個列表或者另一個列表,比如這裡'wife_measurements’是指xiaobai老婆的三圍,那可以傳遞一個包含三個值的列表,這也是我們上面說到過的列表字典都可以相互巢狀
  • 字典的值可以是任意型別,比如這裡的"future":None, 因為,因為你沒有未來啊,啊哈哈
訪問字典裡的值

現在我們已經成功建立了一個字典,那麼如何獲取字典中的值呢?我們知道在List中可以通過切片[start_index:end_index]來獲取,字典裡提供了另一種形式:

dict[name_of_key]   #把相應的鍵放入到方括號中

現在讓我們獲得xiaobai的姓和工資:

    print("The first name of young man is :", young_man['first_name'])
    print("Salary of young man:",young_man['salary'])

Out: The first name of young man is: bai
     Salary of young man: 20000.00

很簡單吧,如果是xiaobai老婆的三圍呢?

    print(young_man['wife_measurements'])
Out:[82, 62, 82]

如果就對胸圍感興趣呢? 因為'wife_measurements'這個鍵對應的值為一個列表,我們可以接著使用列表獲取值的方法:

     print('The Bust measure is',young_man['wife_measurements'][0],'cm')
Out: The Bust measure is 82 cm
 

如果對所有的值都感興趣呢?那很簡單,字典提供了一個非常簡單的方法values():

     print(young_man.values())
Out:dict_values(['bai', 'xiao', 23, 'Beijing', '985', 'beida', 'Developer', 10000, 'Start Up', True, [82, 62, 82], 1, None])

這樣我們就獲得young_man裡面所有的值了

訪問字典裡的鍵

不用多解釋,很簡單,也是一個自帶的方法.keys():

        print(young_man.keys())
   Out: dict_keys(['first_name', 'family_name', 'age', 'city', 'university_rank', 'university_name', 'job', 'salary', 'company', 'married', 'wife_measurements', 'number_of_children', 'future'])
訪問字典裡的鍵和值

經過上面的介紹,我們可以分別獲得字典的值和鍵,現在我們要把他們融合一下,其實很簡單,因為本身字典可以迭代:

    for k,v in young_man.items():
        print(k,":",v)

Out:first_name : bai
    family_name : xiao
    age : 23
    city : Beijing
    university_rank : 985
    university_name : beida
    job : Developer
    salary : 10000
    company : Start Up
    married : True
    wife_measurements : [82, 62, 82]
    number_of_children : 1
    future : None

字典裡有一個方法:.items(),說白了就是獲取到當前的鍵和值,這裡我們用一個for迴圈可以迭代這個字典,分別輸出鍵和值,這裡注意一下,k,v是什麼不重要,大家可以把k,v換成其他的字母都是沒有問題的,有關字典的很多實用技巧我們下一期會講。

新增,修改字典裡的值

結婚1年後的你攢了10萬塊,加上6個錢包的100萬在北京付了首付,買來了小兩居,然而醜萌的孩子,漂亮的老婆,加上房子的月供讓你不堪重負,好在經過你的努力,現在的工資已經漲到了3萬,變成了傳說中的產品經理,身旁電視裡響起共克時艱的號召,看似美好的生活向你招手,但壞訊息突然接踵而至,首先第二個孩子的出生讓你的經濟狀況雪上加霜,你在感嘆杜蕾斯的產品質量同時突然發現事情有些不對......

你忽然回憶起很多細節,最近幾個月趕專案,經常在深夜回家時發現一輛扎眼的保時捷正開出小區,到家時妻子經常滿面潮紅的剛剛洗完澡出現在你面前, 你經常關注著中興老員工跳樓,xxx創業失敗煤氣自殺等負面新聞,卻忽略了妻子錢包多出來的各種美容健身購物酒店卡....

眼前冒綠星的你心中一涼,拿起土著的照片看了看,又看看自己懷裡新出生的老二,眉宇間竟有幾分相似,腦袋嗡的一聲後決定要去做親子鑑定...

首先先讓我們看看如何在字典裡新加一個值,讓我們把xiaobai的銀行存款和買加進去:

young_man['bank_account']=100000
young_man['Own_house']=True

其實很簡單啦,只要把ke和value按照圖中形式新增就好了,這個時候我們再看young_man這個字典就會發現已經多了兩個值:

{'first_name': 'bai', 'family_name': 'xiao', 'age': 23, 'city': 'Beijing', 'university_rank': '985', 'university_name': 'beida', 'job': 'Developer', 'salary': 20000.0, 'company': 'Start Up', 'married': True, 'wife_measurements': [82, 62, 82], 'number_of_children': 1, 'future': None, 'bank_account': 100000, 'Own_house': True}

其次,xiaobai的職業,薪水,和孩子的數量有了變化,此時需要對字典中對應的值進行修改,這裡十分簡單:

young_man['age']+=1
young_man['job'] = 'Product Manager'
young_man['salary']=30000.00
young_man['number_of_children']=2

再看一下現在的young_man:

{'first_name': 'bai', 'family_name': 'xiao', 'age': 24, 'city': 'Beijing', 'university_rank': '985', 'university_name': 'beida', 'job': 'Product Manager', 'salary': 30000.0, 'company': 'Start Up', 'married': True, 'wife_measurements': [82, 62, 82], 'number_of_children': 2, 'future': None, 'bank_account': 100000, 'Own_house': True}

此外如果修改多個值,用update()是最方便的,我們下一篇筆記會說~

刪除字典裡的值

醫院的結果出來了,不出意料,杜蕾斯質量沒問題,你迅速回到家中準備興師問罪,卻發現妻子早已準備好了離婚協議,在暴怒之中的你想也沒想就選擇了淨身出戶,把所有的一切都留給了妻子,自己沒日沒夜地工作期待有一天公司上市自己套現離場,繼續開始人生下半場,然而一切都是命中註定,不知怎麼,你也成為了《就算老公一毛錢股份都沒拿到,在我心裡,他依然是最牛逼的創業者》裡的主角,命運向你展示了它猙獰的一面,你最後的希望隨之破滅,終日借酒澆愁。

在一個百無聊賴的晚上,你帶著僅有的幾千塊錢做了一次高階大保健,負責給你服務的小姐姐名叫skyler,來自美國新墨西哥州的Albuquerque市,人生失意的你唱著崔健的<<一無所有>>和她傾訴了自己的前半生,笑靨如花的小姐姐安慰了你,向你描述了美利堅大地上美好的一切和自己同樣悲慘的前半生,同時天涯淪落人,相逢何必曾相識!

伴隨著大保健配套的bgm《沙漠駱駝》,醉眼朦朧的你彷彿看到了遙遠的Albuquerque市,便宜的大別墅和skyler的笑臉,一切盡在咫尺,卻又遙不可及。。。

回到正題,這裡xiaobai選擇淨身出戶,因此很多屬於他的東西全部沒了,刪除字典中的值很簡單,只需要del關鍵字:

clipboard.png

這裡刪除的東西有點多,我利用了上篇筆記講過的知識,首先建立了一個列表,裝入young_man的想要刪除的鍵值,然後利用迭代一次刪除,這並不是一個優雅的方法,但是目的是讓大家看一下列表和字典的一個結合操作,現在再看一下young_man:

{'first_name': 'bai',
 'family_name': 'xiao',
 'age': 24,
 'city': 'Beijing',
 'university_rank': '985',
 'university_name': 'beida',
 'future': None}

這個時候如果我們還想看看銀行存款是不可能的了,如果我們嘗試老方法:

young_man['bank_account']   # ERROR

會很容易的報錯,因為在字典中已經沒有這個值了,為了避免報錯,我推薦大家使用get方法:

print(young_man.get('bank_account','Not Found'))  # 如果沒有輸出Not Found
Out: Not Found
建立字典的其他方式*

還未到30的你做出了一個人生中最重要的決定,那就是和skyler一起去她的老家Albuquerque市,從零開始
你用你僅存的化學知識在當地的高中謀取到了一個化學老師的工作,利用自己姓名xiaobai起了一個地道的美國名字:Walter White, 小城市的生活悠閒愜意,當地的炸雞店“Los Pollos Hermanos”味美絕倫,你和skyler也有了愛的結晶,又一個醜萌而且先天殘疾的孩子出生了。。

此時的xiaobai已經有了全新的身份,這裡我們換一種方式建立他的全新個人資訊:

walter_white_keys = ['name','age','job','subject','adress','wife']
walter_white_values = ['Walter White',50,'Teacher','Chemistry','Albuquerque','Skyler']
Breaking_Bad = dict(zip(walter_white_keys,walter_white_values))

檢視一下全新的老白:

    print(Breaking_Bad)
    {'name': 'Walter White',
     'age': 50,
     'job': 'Teacher',
 'subject': 'Chemistry',
  'adress': 'Albuquerque',
    'wife': 'Skyler'}
 
清空字典*

你也會時常想起國內拋下的孩子,感慨天道有輪迴,善惡到頭終有報,20年如白駒過隙, 稍縱即逝,此刻你已年近50,知天命的年齡被診斷出了癌症,正當你覺得人生無望的時候,一個曾經教過的小混混學生Jesse Pinkman出現在你的面前,從此江湖上開始了你的傳說。。。

故事的最後,你看著腹部緩緩流出的鮮血,沒有理會,依然專注地在製作眼前令無數人痴迷的藍色結晶物,直到體力不支緩緩倒地,在生命的最後時刻,伴隨著耳邊的《Baby Blue》,眼前依稀看到了30年的那個意氣風發的少年坐在街邊咖啡館,正專注地學習Python,直到一個女孩款款向他走來。。。。。。

至此,一代梟雄終落幕,最後讓我們忍住眼淚,敲下最後的程式碼:

 Breaking_Bad.clear()
 del Breaking_Bad

我想可能有一句話能概括最後時刻老白的內心想法:我愛你不後悔,也尊重故事的結尾

clipboard.png

如果你也是老白的粉絲,那就擴散吧,完結,撒花~

相關文章