跳到主要內容

Python筆記(6)-字典的操作

 6-1 字典的基本語法

針對有對應關係的資料我們可以用字典的資料型來儲存,字典的資料結構是以鍵(keys):值(values)表示,其中鍵(keys)必須唯一,值(values)可以不唯一,我們可以藉由鍵(keys)來查詢值(values)。字典的基本語法試用{}表示或以dict()建立空字典。以下說明字典的建立方法:

程式碼

#字典建立方法(1)

dict1={"banana":30,"apple":50,"orange":80}

print(dict1)

#字典建立方法(2)

list2=[["banana",30],["apple",50],["orange",80]]

dict2=dict(list2)

print(dict2)

Python畫面

6-2 字典的取值

字典取值方式無法用索引值方式取值,需要靠鍵(keys)來取得相對應的值(values),語法為字典名稱[鍵],結果會得到相對應的值。但若鍵不再字典中則會得到錯誤訊息導致程式中斷。

程式碼

#字典取值方式(1)

dict1={"banana":30,"apple":50,"orange":80}

print(dict1["banana"])

print(dict1["pieapple"])

Python畫面

對於沒有鍵(keys)查詢會導致錯誤訊息程式中斷的問題,可以用字典名稱.get()函數避免掉,沒有鍵(keys)查詢的部分可以設定回傳的結果,這樣就不會因為錯誤訊息導致程式中斷,說明方式如下:

程式碼

#字典取值方式(2)

dict1={"banana":30,"apple":50,"orange":80}

print(dict1.get("banana","查無此鍵!"))

print(dict1.get("pieapple","查無此鍵!"))

print(dict1.get("pieapple"))

Python畫面

字典名稱.get()函數中有兩個參數,字典名稱.get(鍵值,鍵值不存在的回傳值),若第二個參數沒有設定,查詢不到鍵值時,回傳值預設是None。

6-3 字典的修改、新增與刪除

*修改:要修改某一個鍵對應的值,可以直接重新指定即可。即字典名稱[鍵]=新值

*新增:若要新增一個鍵,可以直接以指定的方式即可。即字典名稱[新鍵]=新值

讀者可以看到,修改與新增的寫法是相同的,如果鍵是存在的,則功能為修改;若鍵不存在,功能為新增。

*刪除:刪除可以分三種情形

        #1 刪除某一個鍵-值:語法 del 字典名稱.[鍵]

        #2 刪除整個字典:語法 del 字典名稱

  #3 清空字典:語法 字典名.clear()

程式碼

#字典的修改、新增與刪除

dict1={"banana":30,"apple":50,"orange":80}

print("修改前dict1:{}".format(dict1))

dict1["banana"]=100

print("修改後dict1:{}".format(dict1))

dict1["piebanana"]=50

print("新增後dict1:{}".format(dict1))

del dict1["apple"]

print("刪除apple後的dict1:{}".format(dict1))

dict1.clear()

print("清空dict1:{}".format(dict1))

del dict1

print("移除dict1:{}".format(dict1))

Python畫面

6-4 字典的進階用法

以下繼續介紹字典的進階用法並用一個成績查詢系統來說明函數的用法:

程式碼

#字典的相關函數操作(1)

score_list=[["王曉明",[60,70,80]],["陳大華",[100,20,80]],["張小美",[60,65,83]]]

score_dict=dict(score_list)

while True:

    query=input("0:查詢學生人數\n1:學生姓名列表\n2:學生姓名查詢\n3:成績表\n4:新增名單\n5:移除名單\n任意鍵離開查詢...")

    if query=="0":

        print("學生人數:{}人".format(len(score_dict)))

    elif query=="1":

        for n in score_dict.keys(): print(n)

    elif query=="2":

        student_name=input("請輸入姓名...")       

        if student_name in score_dict.keys():

            print("為本班學生!")

        else:

            print("非本班學生!")

    elif query=="3":

        print("{:<6s}{:<4s}{:<4s}{:<4s}".format("姓名","國文","英文","數學"))

        for name,s in score_dict.items():

            print("{:<6s}{:<6d}{:<6d}{:<6d}".format(name,s[0],s[1],s[2]))

    elif query=="4":

        student_name=input("請新增學生姓名...")

        if student_name in score_dict.keys():

            print("該學生已存在!")

        else:

            score=input("請分別輸入國文、英文、數學成績(請以,分開)...")

            score_dict.setdefault(student_name,list(map(int,score.split(","))))

    elif query=="5":

        student_name=input("請輸入學生姓名...")

        if student_name not in score_dict.keys():

            print("該學生不存在!")

        else:

            del score_dict[student_name]

    else:

        print("<<結束查詢>>")

        break

Python畫面

接下來說明一下字典複製後在指定給另一個變數與將字典直接指定給另一個變數的差異,兩者都能夠呈現出字典複製的效果,但依不同的需求寫法就會不一樣。以變數指定的方式在元字典內容改變後,被指定的那個變數的內容也會跟著改變;如果用使用字典名稱.copy()函數,則原字典內容改變不會影響被指定的變數內容。下面程式碼將說明兩者差異:

程式碼

#字典的相關函數操作(2)

dict1={"banana":30,"apple":50,"orange":80}

dict2=dict1.copy()

dict3=dict1

print("dict2與dict3是否相同:{}".format(dict2==dict3))

dict1["banana"]=100

print("dict2與dict3是否相同:{}".format(dict2==dict3))

print("dict2={}".format(dict2))

print("dict3={}".format(dict3))

Python畫面

字典更新的功能,可以在一次性需要新增或更新較多數據時發揮很大的功用。當鍵存在時,則值會更新;如果鍵不存在,則會新增一組鍵-值元素,達到同時新增與更新數據的效果。

程式碼

#字典的相關函數操作(3)

keys_list=["A","B","C","D","E"]

values_list=[100,200,300,400,500]

dict3=dict(zip(keys_list,values_list))

print("新增or更新前dict3={}".format(dict3))

keys_update=input("請輸入要新增or更新的key(用,隔開)...")

values_update=input("請輸入要新增or更新的value(用,隔開)...")

new_dict=dict(zip(keys_update.split(","),list(map(int,values_update.split(",")))))

dict3.update(new_dict)

print("新增or更新後dict3={}".format(dict3))

Python畫面

zip()函數的使用可以將多個串列中相同索引值的元素組成元組(有種拉拉鍊的感覺…),可用list()轉成串列型態,如果只有兩個串列,則可使用dict()轉成字典型態。我們參考以下網路資料可發現當兩個串列長度不同時,會以短的為主,長的多餘的部分則會被捨去。另外zip(*)函數可將結果轉換回多維串列。

留言

這個網誌中的熱門文章

RPA-Uipath筆記(1) - 如何從網路上下載資料並存至指定路徑

最近在做 RPA 相關專案時遇到了這個問題: 如何從網路上下載資料並存至指定路徑? 針對這個問題我們採取的解決方案是 先讓檔案下載到電腦的預設路徑,再將檔案移動到我們指定的資料夾 。 以下我們用下載政府公開資料平台的資料 ("https://data.gov.tw/dataset/116285") 為例, Uipath 的流程建立如下: 使用到了 Wait for Download 、 Move File 、 Delete File 三個 Activity , Wait for Download 中 Monitored folder 必須放瀏覽器中設定的下載檔案的預設路徑且關閉詢問儲存位置。 Downloaded file 則是設定一個變數名稱 downloadfile( 可自訂 ) ,此變數的資料型態是 FileInfo 。中間則放入下載的流程步驟,從下載開始到結束都會在此 Activity 中執行完畢,執行完後所下載的檔案的相關資訊都會被存放在變數 downloadfile 中。 接下來是將檔案從預設下載路徑中移至指定路徑,這裡就需要下載預設路徑與指定路徑,這兩個我們在流程一開始就建了了兩個變數 dnlo_path 、 asng_path ,寫法如下: dnlo_path = "C:\Users\" +system.Environment.UserName+ "\Downloads" system.Environment.UserName à VB 語法,代表目前電腦的使用者名稱。 asng_path = "D:\Bolg 資料 \Uipath\Uipath(1)" Move File Activity 中 From 要放入目前檔案的位置; To 則要放入檔案存放的指定的位置,但因為是要做檔案的移動,所以以上兩個路徑後面都要再加上檔案名稱,這時可以使用 downloadfile 這個變數的屬性值叫出檔案名稱( downloadfile.Name ),當檔案名稱是隨機變動的時候,非常好用。另外,特別值得注意的是, To 的部分在加上檔案名稱時,可以不用用原始檔案的名稱,這時可以同時達到修改檔名的效果。 Overwrite 的部分打勾代表再重複執行一次的時...

RPA-Uipath(5)-如何讀取Mail與取得Mail的資訊

本篇主要介紹 Uipath 取得 mail 相關資訊與附件的方法,因為 mail 的種類眾多,本範例以 Gmail 為例。首先在使用 Uipath 取得 Gmail 相關資訊前須對 Google 帳戶的安全性進行兩階段驗證設定,設定方式如下: Step1. 點選 ” 管理你的 Google 帳戶 ” Step2.  點選 ” 安全性 ” à ” 兩階段驗證 ” à 點選 ” 開始使用 ” Step3.  依 Google 所提示步驟,您最後會取得一組密碼,請務必將此密碼記下。 接下來要開始使用 Uipath 擷取 mail 相關資訊,一開始我們先使用 Get Password 儲存 mail 登入的密碼,此時密碼不是使用您真正的密碼而是使用剛剛兩階段驗證後取得的密碼,並儲存於變數 password 。 接下來使用 Get IMAP Mail Messages 來取得 mail 的相關資訊,在使用 Get IMAP Mail Messages 時必須在其屬性設定區塊進行一些參數設定。 Port 欄位填入 993 , Server 欄位填入 "imap.gmail.com" , Email 欄位填入您的 Email , Password 欄位填入 變數 password , Message 欄位我們用 MailMessage 變數填入 Mail 的相關資訊都會存在 MailMessage 變數中,我們可以用 For Each 迴圈逐一取得 mail 的相關資訊。 For Each 的屬性區塊部分也需要進行一些參數設定, List of item 欄位需填入 MailMessage 變數, TypeArgument 則須設定為 System.Net.Mail.MailMessage 。 設定完成後,我們先用 Write Line 將信件的主旨印出做為測試( 這邊我們只印出前 5 封信件的主旨,可在 Get IMAP Mail Messages 的屬性區塊中 Top 欄位中設定 ),如果要印出信件主旨,需要用 item.Subject 屬性,如要印出其他資訊,我們將常用的幾個列在以下表格: 最後,有些信件會附帶一些附件,我們如何將這些物件儲存下來呢 ? 這邊只需要用到 Save Attachments 即可。我們將其放在迴圈內以下載每個有附件的 mail...

RPA-Uipath(6)-如何讀取檔案的相關日期與時間

這一篇我們主要要說明如何批次將檔案的 ” 建立時間 ” 、 ” 修改時間 ” 、 ” 存取時間 ” 擷取出來,並整理匯出一個 Excel 表格。 在說明之前,我們簡單說明一下我們要擷取的是那些時間,我們可以針對任一個檔案,按下右鍵,選取內容,就會跳出該檔案的相關資訊,其中就有所謂的 ” 建立時間 ” 、 ” 修改時間 ” 、 ” 存取時間 ” ,如下圖所示,我們的目的就是將這些時間一一擷取出來。 要擷取以上的這些時間,需要用到 FileInfo() 物件,用法如下: 1.      建立時間: new FileInfo( 檔案路徑 ).CraeationTime.ToString( 日期時間格式 ) 2.      最後修改時間: new FileInfo( 檔案路徑 ).LastWriteTime.ToString( 日期時間格式 ) 3.      最後存取時間: new FileInfo( 檔案路徑 ).LastAccessTime.ToString( 日期時間格式 ) 因為我們的範例要批次讀取一個資料夾中多個檔案,所以會用到 Directory.GetFiles( 資料夾路徑 ) ,此函數會回傳資料夾中所有檔案的路徑並以 List 型態儲存。 以下我們說明我們如何用 Uipath 達到此目的: 我們一開始先用 FilePathList 變數儲存資料夾中所有檔案的路徑,建立一個空的 DataTable ,其中我們建立了四個欄位 ”FileName” 、 ”CreationTime” 、 "LastModifiedTime" 、 ”LastAccessTime” 。 接下來,利用 For Each 對每一個檔案,擷取以上四個資訊並分別用四個變數儲存 FileName 、 FileCreationTime 、 FileLastModifiedTime 、 FileLastAccessTime 並將次四個資訊放入 DataTable 中 ( 利用 Add Data Row 的 Activity) 。 For Each 結束後,我們將 DataTable 寫入 Excel 中並存於同一個資料夾,如下圖所示。