記錄個人 python 學習歷程-Day05 字典/字典的嵌套

1、字典的初識

  • 爲何要有字典python

    字典與列表同屬容器型數據類型,一樣能夠存儲大量的數據,可是,列表的數據關聯性不強,而且查詢速度比較慢,只能按照順序存儲。面試

  • 什麼是字典學習

    • 先說一下什麼叫可變與不可變的數據類型分類code

      • 不可變(可哈希)數據類型:int, str, bool, tuple。
      • 可變(不可哈希)數據類型:list, dict, set。
    • 字典是Python語言中的映射類型,他是以{}括起來,裏面的內容是以鍵值對的形式儲存的對象

      • 字典的基本格式索引

        dic = {'Dylan':
              {'name':'Dylan', 'age': 18, 'sex':'男'},
              'city':['beijing', 'qingdao', 'jiangsu']
              }
        # 這是一個嵌套的字典
      • Key(鍵):不可變(可哈希)的數據類型,而且鍵是惟一的,不重複的。three

      • value(值):任意數據類型(int, str, bool, tuple, list, dict, set),包括後面要學的實例對象等等。內存

      • 字典在3.5x版本以前(包括3.5)是無序的。ci

      • 字典在3.6x會按照次創建字典的順序排列,學術上不認爲是有序的。get

      • 字典在3.7x 之後都是有序的了。

      • 字典的優勢:查詢速度很是快,存儲關聯性的數據。

      • 字典的缺點:以空間換時間。也就是說,它的內存消耗很是大。

  • 字典的建立

    # 面試會考
    # 方式一:
    dic = dict((('one', 1), ('two', 2), ('three', 3)))
    print(dic)  # {'one': 1, 'two': 2, 'three': 3}
    
    # 方式二:
    dic = dict(one=1, two=2, three=3)
    print(dic)  # {'one': 1, 'two': 2, 'three': 3}
    
    # 方式三:
    dic = dict({'one': 1, 'two': 2, 'three': 3})
    print(dic)  # {'one': 1, 'two': 2, 'three': 3}
  • 字典的合法性

    # 合法
    dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帥哥', '美⼥'], (1, 2, 3): '麻花藤'}
    print(dic[123]) # 456
    print(dic[True]) # 999
    print(dic['id']) # 1
    print(dic['stu']) # ['帥哥', '美⼥']
    print(dic[(1, 2, 3)]) # 麻花藤
    
    # 不合法
    dic = {[1, 2, 3]: '周杰倫'} # list是可變的. 不能做爲key
    dic = {{1: 2}: "哈哈哈"} # dict是可變的. 不能做爲key
    dic = {{1, 2, 3}: '呵呵呵'} # set是可變的, 不能做爲key

2、字典的增、刪、改、查

  • 字典的增

    • 直接增長 有則改之,無則增長

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic['sex'] = '男'    # 原字典裏沒有這個鍵值對,因此會新增長這個鍵值對。
      dic['age'] = 22     # 原字典裏己經有這個鍵了,因此會更改原字典這個鍵的值。
      print(dic)          # {'name': 'Dylan', 'age': 22, 'hobby_list': ['IT', '妹子', '旅行'], 'sex': '男'}
    • dic.setdefault('鍵','值') 有則不變,無則增長

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic.setdefault('hobby')     # 新增一個鍵,值爲空(None)
      dic.setdefault('hobby', '汽車')   # 這條是要給 hobby 加個值,可是,上一條己經建立了一個一樣的鍵,因此。這一行的值是不能加進去的,能夠用改的方法,改變原來的空值爲這一條的值。
      dic.setdefault('age', 33)   # 這條跟上一條同理,原字典中己有的鍵值不會被增長修改。
      print(dic)  # {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行'], 'hobby': None}
  • 字典的刪

    • dic.pop('鍵','第二個參數值')

      # pop 按照鍵刪除鍵值對, 有返回值  ***
      # 設置第二個參數則不管字典中有無此鍵都不會報錯
      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic.pop('name') # 這是 pop 的基本用法
      ret = dic.pop('name')   # 刪除字典中 name 鍵 和 Dylan 值,並將刪除的值賦值給 ret,可是,因爲上一條中己經執行了一次刪除 name,這一條找不到原字典中的 name 鍵,因此.程序會報錯.以下:
      ###
      Traceback (most recent call last):
        File "/Users/yaoyaoba/Full_stack_22/day04/練習.py", line 145, in <module>
          ret = dic.pop('name')
      KeyError: 'name'
      ###   
      ret1 = dic.pop('hobby','沒有此鍵')  # 爲了不報錯,一般咱們會再加上一個返回參數,能夠自定義.格式如些條.
      print(ret)  # Dylan
      print(ret1) # 沒有此鍵
      print(dic)  # {'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
    • dic.clear() 清空

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic.clear()     # 清空字典內的鍵值對,並留下一個空字典。
      print(dic)      # {}
    • del 刪除字典中的某個鍵值對/或者刪除整個字典

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      del dic['age']
      print(dic)
      del dic['name1']    # 若是要刪除的鍵沒有在字典中,則會報錯,因此通常不用這個方法刪除鍵值對。
      ###
      Traceback (most recent call last):
        File "/Users/yaoyaoba/Full_stack_22/day04/練習.py", line 143, in <module>
          del dic[name1]
      NameError: name 'name1' is not defined
      ###
      del dic     # 將整個字典刪掉
      print(dic)  # 打印會報錯
      ###
      Traceback (most recent call last):
        File "/Users/yaoyaoba/Full_stack_22/day04/練習.py", line 144, in <module>
          print(dic)
      NameError: name 'dic' is not defined
      ###
  • 字典的改

    • 直接改

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      dic['age'] = 33     # 將字典中'age'鍵的值改成'33'
      print(dic)
  • 字典的查

    • 經過鍵查詢

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic['name'])  # Dylan
      # 若是所查的鍵沒在字典裏,會報錯。
      print(dic['name2'])
      ###
      Traceback (most recent call last):
        File "/Users/yaoyaoba/Full_stack_22/day04/練習.py", line 143, in <module>
          print(dic['name2']) # Dylan
      KeyError: 'name2'
      ###
    • dic.get('鍵') 查詢並返回一個結果,能夠賦值給變量

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      v = dic.get('name')
      print(v)    # Dylan
      v = dic.get('name1')
      print(v)    # None (若是字典中沒有這個鍵,將返回一個空值,避免報錯)
      v = dic.get('name2', '沒有此鍵')    # 若是字典中沒有這個鍵值對,能夠自定義一個反回的值。
      print(v)    # 沒有此鍵
  • 字典的三個特殊用法

    • dic.keys() 查找字典中全部的鍵

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic.keys(), type(dic.keys()))     # dict_keys(['name', 'age', 'hobby_list']) <class 'dict_keys'>
      # 能夠轉化爲列表
      print(list(dic.keys())) # ['name', 'age', 'hobby_list']
      for key in dic.keys():
          print(key)  # 打印字典中每一個鍵
      for key in dic:
          print(key)  # 打印字典中每一個鍵(等價於上面的方法)
    • dic.values() 查找字典中全部的值

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic.values()) # dict_values(['Dylan', 18, ['IT', '妹子', '旅行']])
      print(list(dic.values()))   # ['Dylan', 18, ['IT', '妹子', '旅行']]
      for value in dic.values():
          print(value)    # 打印字典中每一個值
    • dic.items() 查找字典中全部的鍵和值 (以字典包裹元組的形式)

      dic = {'name': 'Dylan', 'age': 18, 'hobby_list': ['IT', '妹子', '旅行']}
      print(dic.items())  # dict_items([('name', 'Dylan'), ('age', 18), ('hobby_list', ['IT', '妹子', '旅行'])])
      for key,value in dic.items():
          print('鍵:', key, '值:' , value)
      # 打印結果:
      鍵: name 值: Dylan
      鍵: age 值: 18
      鍵: hobby_list 值: ['IT', '妹子', '旅行']
      
      # 這裏涉及到一個分別賦值的問題:
      面試題:
      a = 18
      b = 12
      a, b = b, a
      # 等價於 a, b = 12, 18
      print(a, b)

3、字典的嵌套

​ 字典的嵌套是很是重要的知識點,這個必需要創建在熟練使用字典的增刪改查的基礎上,並且字典的嵌套纔是我們在工做中常常會遇到的字典,工做中遇到的字典不是簡簡單單一層,而就像是蔥頭同樣,一層接一層,但通常都是頗有規律的嵌套,那麼接下來咱們就學習一下字典的嵌套:

dic = {
    'name':'汪峯',
    'age':48,
    'wife':[{'name':'國際章','age':38}],
    'children':{'girl_first':'小蘋果','girl_second':'小怡','girl_three':'頂頂'}
}

1. 獲取汪峯的名字。
2.獲取這個字典:{'name':'國際章','age':38}。
3. 獲取汪峯妻子的名字。
4. 獲取汪峯的第三個孩子名字。

# 解題思路:
# 1.獲取汪峯的名字。: 這個比較簡單,汪峯就是dic的一個鍵對應的值,咱們經過這個key就能夠獲取到汪峯這個值。

name = dic['name']
print(name) # 汪峯

# 2. 獲取這個字典{'name':'國際章','age':38}: 想要獲取這個字典,先要看字典從屬於誰?這個字典從屬於一個列表,而這個列表是字典wife對應的鍵,因此我們應該先經過wife獲取到對應的這個列表,而後經過這個列表按照因此取值取到對應的這個字典。

l1 = dic['wife']    # 先獲取到這個列表
di = l1[0]  # 列表按照索引取值,這個字典是列表的第一個元素,因此經過索引獲取到這個字典
print(di)   # {'name': '國際章', 'age': 38}

# 3. 獲取汪峯的妻子名字: 仍是按照上一題的思路:想要獲取汪峯妻子的名字:國際章,那麼他是一個字典的鍵對應的值,因此咱們經過'name'這個鍵就能夠獲取到對應的值,這個題的難點是獲取到這個小字典,而上一個題咱們已經獲取了這個小字典,因此在上面的基礎上再執行就能夠了。

di = dic['wife'][0]  # 這個是上一次題獲取的小字典的代碼
wife_name= di['name']  # 經過小字典而後再經過鍵就能獲取到對應的值
print(wife_name)    # 國際章

# 固然我們能夠簡化:
wife_name = dic['wife'][0]['name']
print(wife_name)    # 國際章

# 4.獲取汪峯的第三個孩子名字: 汪峯的孩子們是在一個字典中的,你要想獲取汪峯的第三個孩子,你應該先獲取到它從屬於的這個字典,而後再經過這個字典獲取第三個孩子的名字。

dic2 = dic['children']  # 先獲取這個字典
name = dic2['girl_three']  # 在經過這個字典獲取第三個孩子的名字
print(name) # 頂頂

# 固然你能夠簡化:
name = dic['children']['girl_three']
print(name) # 頂頂
相關文章
相關標籤/搜索