1. 程式人生 > >第025講:字典:當索引不好用時

第025講:字典:當索引不好用時

目錄

測試題

0. 當你聽到小夥伴們在談論“對映”、“雜湊”、“雜湊”或者“關係陣列”的時候,事實上他們就是在討論什麼呢?

1. 嘗試一下將資料('F': 70, 'C': 67, 'h': 104, 'i': 105, 's': 115)建立為一個字典並訪問鍵 'C' 對應的值?

2. 用方括號(“[]”)括起來的資料我們叫列表,那麼使用大括號(“{}”)括起來的資料我們就叫字典,對嗎?

3. 你如何理解有些東西字典做得到,但“萬能的”列表卻難以實現(臣妾做不到T_T)?

4. 下邊這些程式碼,他們都在執行一樣的操作嗎?你看得出差別嗎?

5. 如圖,你可以推測出打了馬賽克部分的程式碼嗎?

動動手

0. 嘗試利用字典的特性編寫一個通訊錄程式吧,功能如圖:

1. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!


測試題

0. 當你聽到小夥伴們在談論“對映”、“雜湊”、“雜湊”或者“關係陣列”的時候,事實上他們就是在討論什麼呢?

答:是的,事實上他們就是在討論我們這一講介紹的“字典”,都是一個概念!(切記,裝X的本質就是把同一個東西說成各種不同的事物~)

1. 嘗試一下將資料('F': 70, 'C': 67, 'h': 104, 'i': 105, 's': 115)建立為一個字典並訪問鍵 'C' 對應的值?

>>> MyDict = dict((('F', 70), ('i',105), ('s',115), ('h',104), ('C',67)))
>>> MyDict_2 = {'F':70, 'i':105, 's':115, 'h':104, 'C':67}
>>> type(MyDict)
<class 'dict'>
>>> type(MyDict_2)
<class 'dict'>
>>> MyDict['C']
67

2. 用方括號(“[]”)括起來的資料我們叫列表,那麼使用大括號(“{}”)括起來的資料我們就叫字典,對嗎?

答:不對。

>>> NotADict = {1, 2, 3, 4, 5}
>>> type(NotADict)
<class 'set'>

不難發現,雖然我們用大括號(“{}”)把一些資料括起來了,但由於沒有反映出這些資料有對映的關係,所以創建出來的不是字典,而是叫’set’的東西,那’set’到底又是啥玩意兒呢?請看第027講 | 集合:在我的世界裡,你就是唯一!

3. 你如何理解有些東西字典做得到,但“萬能的”列表卻難以實現(臣妾做不到T_T)?

舉個例子:

>>> brand = ['李寧', '耐克', '阿迪達斯', '魚C工作室']
>>> slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing', '讓程式設計改變世界']
>>> print('魚C工作室的口號是:', slogan[brand.index('魚C工作室')])
魚C工作室的口號是: 讓程式設計改變世界

列表brand、slogan的索引和相對的值是沒有任何關係的,我們可以看出唯一有聯絡的就是兩個列表間,索引號相同的元素是有關係的(品牌對應口號嘛),所以這裡我們通過brand.index('魚C工作室')這樣的語句,間接的實現通過品牌查詢對應的口號的功能。
  
這確實是一種可實現方法,呃……但用起來呢,多少有些彆扭,效率還不高咧。況且Python是以簡潔為主,這樣子的實現肯定是不能讓人滿意的,所以呢,我們需要有字典這種對映型別的出現:

>>> dict1 = {'李寧':'一切皆有可能', '耐克':'Just do it', '阿迪達斯':'Impossible is nothing', '魚C工作室':'讓程式設計改變世界'}
>>> print('魚C工作室的口號是:', dict1['魚C工作室'])
魚C工作室的口號是: 讓程式設計改變世界

4. 下邊這些程式碼,他們都在執行一樣的操作嗎?你看得出差別嗎?

>>> a = dict(one=1, two=2, three=3)
>>> b = {'one': 1, 'two': 2, 'three': 3}
>>> c = dict(zip(['one', 'two', 'three'], [1, 2, 3]))
>>> d = dict([('two', 2), ('one', 1), ('three', 3)])
>>> e = dict({'three': 3, 'one': 1, 'two': 2})

答:是的,他們都在建立字典:a = dict(one=1, two=2, three=3),呃,我是看不出差別啦~

5. 如圖,你可以推測出打了馬賽克部分的程式碼嗎?

data = "1000,小甲魚,男"
MyDict = {}
# 還記得字串的分割方法吧,別學過就忘啦^_^
(MyDict['id'], MyDict['name'], MyDict['sex']) = data.split(',') 

print("ID:   " + MyDict['id'])
print("Name: " + MyDict['name'])
print("Sex   " + MyDict['sex'])

動動手

0. 嘗試利用字典的特性編寫一個通訊錄程式吧,功能如圖:


print('|--- 歡迎進入通訊錄程式 ---|')
print('|--- 1:查詢聯絡人資料  ---|')
print('|--- 2:插入新的聯絡人  ---|')
print('|--- 3:刪除已有聯絡人  ---|')
print('|--- 4:退出通訊錄程式  ---|')

contacts = dict()

while 1:
    instr = int(input('\n請輸入相關的指令程式碼:'))
    
    if instr == 1:
        name = input('請輸入聯絡人姓名:')
        if name in contacts:
            print(name + ' : ' + contacts[name])
        else:
            print('您輸入的姓名不再通訊錄中!')

    if instr == 2:
        name = input('請輸入聯絡人姓名:')
        if name in contacts:
            print('您輸入的姓名在通訊錄中已存在 -->> ', end='')
            print(name + ' : ' + contacts[name])
            if input('是否修改使用者資料(YES/NO):') == 'YES':
                contacts[name] = input('請輸入使用者聯絡電話:')
        else:
            contacts[name] = input('請輸入使用者聯絡電話:')

    if instr == 3:
        name = input('請輸入聯絡人姓名:')
        if name in contacts:
            del(contacts[name])         # 也可以使用dict.pop()
        else:
            print('您輸入的聯絡人不存在。')
            
    if instr == 4:
        break

print('|--- 感謝使用通訊錄程式 ---|')
    

1. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

Python中的字典與日常生活中的字典進行比較是:將單詞稱為鍵(key),把這個單詞對應的含義稱為值(value)。另外,Python的字典在很多地方稱為雜湊。Python中的字典為對映型別。

(1)建立和訪問字典

字典的標誌性符號是大括號。字典由多個鍵和其對應的值共同構成,每一對鍵值組合稱之為項,

  • 建立一個空字典:dict1 = { }
  • 一般建立字典方法:dict1 = {1:'one',2:'two',3:'three'}

通過對映關係建立字典:dict1 = dict( ( (1,'one'), (2,'two'), (3,'three') ) )或者dict1 = dict( [ (1,'one'), (2,'two'), (3,'three') ] )或者dict1 = dict( [ [1,'one'], [2,'two'], [3,'three'] ] )

其中,最裡面的幾組小括號或者中括號是表示對映關係,第二層的小括號或中括號是將其組合成元組或列表,然後使用dict()函式根據對映關係建立字典。

  • 修改字典鍵對應的值:dict1[2] = 'double'
  • 增加一組鍵值:在上一行修改字典鍵對應值中,如果沒有找到對應的鍵,就增加一組鍵值:dict1[4] = ‘four’