Python基礎數據類型:字典dict

来源:https://www.cnblogs.com/xiaomage666/archive/2019/05/05/10817214.html
-Advertisement-
Play Games

Python基礎數據類型:字典dict 01 內容大綱 字典的初識 字典的使用(增刪改查) 字典的嵌套 02 具體內容 字典的初識: why: 列表可以存儲大量的數據,數據之間的關聯性不強 ['太白', 18, '男', '大壯', 3, '男'] 列表的查詢速度比較慢。 what:容器型數據類型: ...


Python基礎數據類型:字典dict

01 內容大綱

  • 字典的初識
  • 字典的使用(增刪改查)
  • 字典的嵌套

02 具體內容

  • 字典的初識:

    • why:

      • 列表可以存儲大量的數據,數據之間的關聯性不強
        • ['太白', 18, '男', '大壯', 3, '男']
      • 列表的查詢速度比較慢。
    • what:容器型數據類型:dict。

    • how:

      • 數據類型的分類(可變與不可變)

        • 可變(不可哈希)的數據類型:list dict set

        • 不可變(可哈希)的數據類型: str bool int tuple

          • 不可變是指該對象本身是不可變的,在記憶體中自始至終未變化。

            • 比如,對字元串的任何操作,對原對象沒有任何改變。

              s = 'alex'
              s2 = s.upper()
              print(s,s2)#alex ALEX
              
              s = 'alex'
              s = s.upper()
              print(s)#ALEX   變化的只是變數的指向
            • i = 100
              i = 101
              i = 102   #100,101,102都會在記憶體中占一定空間,變化的只是變數的指向。
      • 字典:{}括起來,以鍵值對形式存儲的容器型數據類型:

        • dic = {'太白':
               {'name': '太白金星','age': 18, 'sex': '男'},
           'python22期': 
               ['朱光亞', '大壯', '雪飛', '岑哥'],
           }
      • 鍵必須是不可變的數據類型:int , str (bool tuple幾乎不用) 鍵要是唯一的

      • 只能通過房間號(鍵)找到房間(值),房間記憶體什麼數據都行

      • 值可以是任意數據類型,對象。

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

      • 字典3.6x會按照初次建立字典的順序排列,學術上不認為是有序的。

      • 字典3.7x以後都是有序的。

      • 字典的優點:查詢速度非常快,存儲關聯性的數據。

      • 字典的缺點:以空間換時間。

    • 字典的創建方式:

      • 面試會考:創建字典的三種方式
        #dict查看源碼  Ctrl+左鍵 點擊dict
        # 方式一:
         dic = dict((('one', 1), ('two', 2), ('three', 3)))  #創建字典用dic = dic()  括弧內包含一個大元組,用括弧括起來,
                                                             #大元組內部包含三個小元組,分別用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)
        
        # 方式三:
         dic = dict({'one': 1, 'two': 2, 'three': 3})    #官方正規寫法dic = dic()  括弧內放了一個字典
         print(dic)
        
         dic = {'one': 1, 'two': 2, 'three': 3}  #平時上課的寫法
        
        # 方式四:
         dic = dict(zip(['one', 'two', 'three'],[1, 2, 3]))
         print(dic)#{'one': 1, 'two': 2, 'three': 3}
        
        # 方式五: 字典推導式 後面會講到
         dic = { k: v for k,v in [('one', 1),('two', 2),('three', 3)]}
         print(dic)#{'one': 1, 'two': 2, 'three': 3}
        
        # 方式六:利用fromkey -->創建一個字典:字典的所有鍵來自一個可迭代對象,字典的值使用同一個值。
         字典的鍵來自於一個可迭代對象(可迭代對象每個元素作為鍵),而值是多個鍵共用一個。
         dic = dict.fromkeys('abcd','太白')
         print(dic)#{'a': '太白', 'b': '太白', 'c': '太白', 'd': '太白'}
        
         dic = dict.fromkeys([1, 2, 3], 'alex')
         print(dic)#{1: 'alex', 2: 'alex', 3: 'alex'}
        
        【面試題會考】#坑:如果通過fromkeys得到的字典的 值 為可變的數據類型,那麼你的小心了。
        dic = dict.fromkeys([1,2,3],[])
        dic[1].append(666)
        print(dic)#{1: [666], 2: [666], 3: [666]}
        
        
    • 驗證字典的合法性:

      # 不合法
      dic = {[1,2,3]: 'alex', 1: 666}  # 鍵要不可變的數據類型
      print(dic)    #TypeError: unhashable type: 'list'
      dic = {[1, 2, 3]: '周傑倫'} # list是可變的. 不能作為key。TypeError: unhashable type: 'list'
      dic = {{1: 2}: "哈哈哈"} # dict是可變的. 不能作為key。TypeError: unhashable type: 'dict'
      dic = {{1, 2, 3}: '呵呵呵'} # set是可變的, 不能作為key。TypeError: unhashable type: 'set'
      
      dic = {1: 'alex', 1: '太白', 2: 'wusir'}  # 鍵要唯一,假如有相同的鍵,後面的自動把前面的鍵值對覆蓋
      print(dic)  #{1: '太白', 2: 'wusir'}
    • 字典的增刪改查【掌握】

      dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
      # 增:
      # 直接增加 有則改之,無則增加
       dic['sex'] = '男'  #沒有sex這個鍵,就增加鍵值對
       print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車'], 'sex': '男'}
      
       dic['age'] = 23  # 改 :有age這個鍵,就成了字典的改值
       print(dic)#{'name': '太白', 'age': 23, 'hobby_list': ['直男', '鋼管', '開車']}
      
      # setdefault  有則不變,無則增加
      dic.setdefault('hobby')
      print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車'], 'hobby': None}     #None空
      
      dic.setdefault('hobby', '球類運動')#無則增加:沒有此鍵則添加
      print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車'], 'hobby': '球類運動'}
      
      dic.setdefault('age', 45)#有則不變:有此鍵則不變
      print(dic)#{'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
      
      
      # 刪
      # pop 按照鍵刪除鍵值對, 有返回值,可以設置返回值;設置第二個參數則無論字典中有無此鍵都不會報錯   ***【重點記】
       dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
       dic.pop('age')
       print(dic)#{'name': '太白', 'hobby_list': ['直男', '鋼管', '開車']}
       ret = dic.pop('age')
       print(ret)  #18  返回刪除鍵對應的值
      
       dic.pop('hobby') #報錯 KeyError: 'hobby'
      
       #設置第二個參數則無論字典中有無此鍵都不會報錯 ;pop返回值可以設置   
       ret = dic.pop('hobby','沒有此鍵')  
       print(ret)#沒有此鍵  
       ret = dic.pop('hobby','哈哈')
       print(ret)#哈哈  (返回值)
      
      
      # popitem 3.5版本之前,popitem為隨機刪除,3.6之後為刪除最後一個,有返回值
       dic = {'name': '太白', 'age': 18}
       ret = dic.popitem()
       print(ret, dic) #('age', 18) {'name': '太白'}
      
      
      # clear  清空字典  **
       dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
       dic.clear()  #把字典內容清空,不是把字典刪除
       print(dic)
      
      # del  通過鍵刪除鍵值對 **
      dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
      del dic['age']
      print(dic)#{'name': '太白', 'hobby_list': ['直男', '鋼管', '開車']}
      #沒有此鍵會報錯
      del dic['age1']#KeyError: 'age1' 報錯
      print(dic)
      
      # del dic 刪除整個字典
      dic = {'name': '太白', 'age': 18}
      del dic
      print(dic)# name 'dic' is not defined   因為字典被刪除了
      
      
      # 改:通過鍵值對直接改
      dic['name'] = 'alex'
      print(dic)
      
      # update用法:
       dic = {'name': '太白', 'age': 18}
       #增加
       dic.update(sex='男',heigth=175)
       print(dic)#{'name': '太白', 'age': 18, 'sex': '男', 'heigth': 175}
      
       #改:
       dic.update(name='alex')            
       print(dic)#{'name': 'alex', 'age': 18}
      
       #【面試會考】
       dic = {'name': '太白', 'age': 18}
       dic.update([(1, 'a'),(2, 'b'),(3, 'c'),(4, 'd')]) #列表中包含多個元組
       print(dic) # {'name': '太白', 'age': 18, 1: 'a', 2: 'b', 3: 'c', 4: 'd'}
      
       #更新,有則覆蓋,無則添加
       dic1 = {"name":"jin","age":18,"sex":"male"}
       dic2 = {"name":"alex","weight":75}
       dic2.update(dic1)
       print(dic2)#{'name': 'jin', 'weight': 75, 'age': 18, 'sex': 'male'}
       dic1.update(dic2)
       print(dic1) # {'name': 'alex', 'age': 18, 'sex': 'male', 'weight': 75}
      
      
      # 查
      #按鍵查值,缺點:沒有鍵會報錯,不建議用
      #通過鍵查詢,直接dic[key](沒有此鍵會報錯)
      dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
      print(dic['hobby_list'])  #['直男', '鋼管', '開車']
      print(dic['hobby_list1']) #報錯  KeyError: 'hobby_list1'
      
      # get  ***【重點記】
      #沒有鍵返回None,不會報錯。可以設置返回值
      
       dic = {'name': '太白', 'age': 18, 'hobby_list': ['直男', '鋼管', '開車']}
       l1 = dic.get('hobby_list')
       print(l1)  #['直男', '鋼管', '開車']
      
       l1 = dic.get('hobby_list','沒有此鍵')  # 可以設置返回值: '沒有此鍵'(返回值)
       print(l1)#['直男', '鋼管', '開車']
      
       l1 = dic.get('hobby_list1')  
       print(l1)  #None    沒有鍵返回None,不會報錯
      
       l1 = dic.get('hobby_list1','沒有此鍵')  # 可以設置返回值
       print(l1)  #沒有此鍵(返回值)
      
      
      # 三個特殊的查
      keys() values() items()
      # keys()
      # 一個高仿列表,存放的都是字典中的key
      print(dic.keys(),type(dic.keys()))   #dict_keys(['name', 'age', 'hobby_list']) <class 'dict_keys'>
      # 可以轉化成列表
      print(list(dic.keys())) #['name', 'age', 'hobby_list']
      
      #迴圈遍歷,列印鍵:
      #1
      for key in dic.keys():
          print(key)
      #2
      for key in dic:
          print(key)
      #結果:
      name
      age
      hobby_list
      
      
       # values()
       dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','鋼管','開車']}
       #一個高仿列表,存放都是字典中的value
       print(dic.values())#dict_values(['taibai', 18, ['直男', '鋼管', '開車']])
       # 可以轉化成列表
       print(list(dic.values()))#['taibai', 18, ['直男', '鋼管', '開車']]
       #迴圈遍歷,列印值:
       #1:
       for value in dic.values():
           print(value)
       #2:
       for key in dic:
              print(dic[key])
       #結果:
       taibai
       18
       ['直男', '鋼管', '開車']
      
      # items()
      dic = {'name':'taibai', 'age': 18, 'hobby_list': ['直男','鋼管','開車']}
      # 一個高仿列表,存放是多個元祖,元祖中第一個是字典中的鍵,第二個是字典中的值  
      print(dic.items())#dict_items([('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '鋼管', '開車'])])
      # 可以轉化成列表
      print(list(dic.items())) #[('name', 'taibai'), ('age', 18), ('hobby_list', ['直男', '鋼管', '開車'])]
      #迴圈遍歷,列印所有鍵值對
      #1:
      for key,value in dic.items():
          print(key,value)
      #2:
      for key in dic:
          print(key,dic[key])
      
      結果:
      name
      taibai
      age
      18
      hobby_list['直男', '鋼管', '開車']
      
      #元組拆包,分別賦值
       a,b = ('name', '太白')
       print(a,b)
      
      #面試題:用一行代碼將a和b的值互換
      a = 18
      b = 12
      a,b = b,a
      print(a,b)#12 18
      
      a,b= 12,18
      print(a,b)
    • 字典的嵌套【掌握】

      dic = {
          'name': '汪峰',
          'age': 48,
          'wife': [{'name': '國際章', 'age': 38},],
          'children': {'girl_first': '小蘋果','girl_second': '小怡','girl_three': '頂頂'}
      }
      
      # # 1. 獲取汪峰的名字。
       print(dic['name'])
       print(dic.get('name'))
      # # 2.獲取這個字典:{'name':'國際章','age':38}。
       print(dic['wife'][0])   #{'name': '國際章', 'age': 38}
       print(dic.get('wife')[0])#{'name': '國際章', 'age': 38}
      # # 3. 獲取汪峰妻子的名字。
       print(dic.get('wife')[0].get('name'))#國際章
       print(dic.get('wife')[0]['name'])#國際章
       print(dic['wife'][0]['name'])#國際章
      # # 4. 獲取汪峰的第三個孩子名字。
       print(dic.get('children').get('girl_three'))#頂頂
       print(dic.get('children')['girl_three'])#頂頂
       print(dic['children']['girl_three'])#頂頂
      
      

      迴圈字典,改變字典大小的問題:

      在迴圈一個字典的過程中,不要改變字典的大小(增,刪字典的元素),這樣會直接報錯。

      dic = {'k1':'太白','k2':'barry','k3': '白白', 'age': 18} 請將字典中所有鍵帶k元素的鍵值對刪除。

       #錯誤做法:
       for key in dic:
           if 'k' in key:
               dic.pop(key)
       print(dic)  #迴圈一個字典時,如果改變這個字典的大小,就會報錯
      
      #自: 把鍵中不含有K元素的鍵值對增加到新的字典中,最後把這個字典賦值給原字典
      dic = {'k1': '太白', 'k2': 'barry','k3': '白白', 'age': 18}
      dic1 = {}
      for key in dic.keys():
          if 'k' not in key:
              dic1[key] = dic[key]
      dic = dic1
      print(dic)#{'age': 18}
      
      
      方法:通過迴圈一個列表,去刪除字典
      ##講:
      dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
      l1 = []
      for key in dic:
          if 'k' in key:
              l1.append(key)
      print(l1)#['k1', 'k2', 'k3']
      for i in l1:  #迴圈一個列表,去刪除字典時不會報錯
          dic.pop(i)  #按照鍵刪除鍵值對
      print(dic)#{'age': 18}
      
      ###2:
      dic = {'k1': '太白', 'k2': 'barry', 'k3': '白白', 'age': 18}
      for key in list(dic.keys()):  # ['k1', 'k2', 'k3','age']
          if 'k' in key:
              dic.pop(key)
      print(dic)#{'age': 18}
      
      

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 書接上文。上文主要講了下線程的基本概念,三種創建線程的方式與區別,還介紹了線程的狀態,線程通知和等待,join等,本篇繼續介紹併發編程的基礎知識。 sleep 當一個執行的線程調用了Thread的sleep方法,調用線程會暫時讓出指定時間的執行權,在這期間不參與CPU的調度,不占用CPU,但是不會釋 ...
  • mq系列文章 對mq瞭解不是很多的,可以看一下下麵兩篇文章: 1. "聊聊mq的使用場景" 2. "聊聊業務系統中投遞消息到mq的幾種方式" 3. 聊聊消息消費的幾種方式 4. 如何確保消息至少消費一次 5. 如何保證消息消費的冪等性 本章內容 從消費者的角度出發,分析一下消息消費的兩種方式: 1. ...
  • day21 03 異常處理 1.什麼是異常 異常:程式運行時發生錯誤的信號 錯誤:語法錯誤(一般是不能處理的異常) 邏輯錯誤(可處理的異常) 特點:程式一旦發生錯誤,就從錯誤的位置停下來,不再繼續執行後面的內容 2.怎麼處理異常呢? 比如下麵類型代碼的異常: 如果執行後用戶輸入的不是數據就會報錯: ...
  • 簡介 Hystrix Dashboard是一款針對Hystrix進行實時監控的工具,通過Hystrix Dashboard可以直觀地看到各Hystrix Command的請求響應時間,請求成功率等數據。 快速上手 工程說明 | 工程名 | 埠 | 作用 | | : | : | : : | | eu ...
  • 變數的使用: def test(request): num=1 s='hello' li=[1,2,['a','b']] dic={'name':'w','age':1} se={1,2,3} tup=(1,2,3,4) def my_test(): return '這是my_test' class ...
  • 所屬網站分類: python高級 > 面向對象 作者:阿裡媽媽 鏈接:http://www.pythonheidong.com/blog/article/74/ 來源:python黑洞網 有什麼區別? class Child(SomeBaseClass): def __init__(self): s ...
  • Unsafe是什麼? Unsafe只有CAS的功能嗎? Unsafe為什麼是不安全的? 怎麼使用Unsafe? ...
  • 一、開發環境 1、windows 7 企業版 2、Eclipse IDE for Enterprise Java Developers Version: 2019-03 (4.11.0) 3、JDK 1.8 4、Maven 3.5.2 5、MariaDB 6、Tomcat 8.5 二、基礎配置 1、 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...