日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python之字典类型数据常见操作及排序

發布時間:2024/5/21 python 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之字典类型数据常见操作及排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、Python 字典

  • Python 的字典 dictionary 是一種靈活的數據結構類型,字典的每個鍵值對(key=>value)用冒號(:)分割,每個對之間用逗號(,)分割。
  • Python 字典里的鍵必須獨一無二,但值則不必的。字典的值可以取任何數據類型,但必須是不可變的(unhashable),如字符串、元組或數值,用列表是不行的。

二、字典的創建

  • 字典的創建主要有 2 種方法:
    • 直接賦值;
    • 根據鍵賦值。
  • 如下所示,分別使用 2 種方法創建了字典 d1 和字典 d2:
>>> d1 = {'key3': 4, 'key2': 5, 'key1': 4} >>> print(d1) {'key3': 4, 'key2': 5, 'key1': 4, } >>> d2 = dict() >>> d2['key5']=1 >>> print(d2) {'key5': 1}

三、訪問字典的鍵與值

  • 可以直接根據 dict[‘鍵名’] 獲取一個值,也可以通過 dict.keys() 獲取所有的鍵或者 dict.values() 獲取所有的值。但需要注意的是 dict.keys() 或 dict.values() 返回的并非列表,需要使用 list 方法才能將所有的鍵和值轉化為列表形式:
>>> d1 = {'key3': 4, 'key2': 5, 'key1': 4} >>> print(d1['key3']) 4 >>> print(d1.keys()) dict_keys(['key3', 'key2', 'key1']) >>> print(list(d1.keys())) ['key3', 'key2', 'key1'] >>> print(list(d1.values())) [4, 5, 4]
  • 當嘗試用一個不存在的鍵獲取值時會出現 KeyError,最好是在獲取值前先使用 if key in dict 來判斷一個鍵是否已經存在。
>>> print(d1['key6']) Traceback (most recent call last):File "<input>", line 1, in <module> KeyError: 'key6' >>> print('key6' in d1) False

四、遍歷字典

  • 使用 for key, value in dict.items()可以遍歷整個字典,如果只喜歡遍歷鍵名或值,可以只使用 for key in dict.keys() 或 for value in dict.values()。
for key, value in d1.items():print("{}->{}".format(key, value))for key in d1.keys():print(key)for value in d1.values():print(value)

五、字典數據的添加

  • 字典與列表一樣都是可變類型的數據,所以可以實現數據的添加和修改。
  • 實現的方法主要有兩種:
    • 創建新的鍵名并賦值;
    • 使用 update 方法。
  • dict 自帶的 update 方法非常有用,不僅可以插入新的鍵值對,還是實現兩個字典合并的首選方法:
>>> print(d1) {'key3': 4, 'key2': 5, 'key1': 4} >>> d1.update({'key4':2}) >>> print(d1) {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2} >>> d1['key5']=1 >>> print(d1) {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2, 'key5': 1}
  • 注意: 當創建的鍵名已存在時,dict[‘鍵名’]只會更新現有值,而不會創建新的鍵值對。

六、刪除字典元素

  • 利用 del dict[‘key’] 可以刪除一個鍵值對,利用 del dict 可以刪除整個字典, 使用 dict.clear() 方法可以清空一個字典:
>>> print(d1) {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2, 'key5': 1} >>> del d1['key5'] >>> print(d1) {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2} >>> d1.clear() >>> print(d1) {} >>> del d1 >>> print(d1) Traceback (most recent call last):File "<input>", line 1, in <module> NameError: name 'd1' is not defined

七、利用 zip 方法由兩個列表創建字典

  • zip()函數來可以把 2 個或多個列表合并,并創建一個元組對的列表,使用 dict 方法可以將其變成字典。
  • 元組對的數量以合并列表的最短長度為準,Python 3 中 zip 方法合并列表后生成的是 zip 對象,必需使用 dict 方法才能將其變成字典:
>>> l1 = [ 1, 2, 3 ] >>> l2 = [ 'x', 'y', 'z'] >>> l3 = [ 'x', 'y' ] >>> zip(l1, l2) <zip object at 0x031D6828> >>> print(list(zip(l1, l2))) [(1, 'x'), (2, 'y'), (3, 'z')] >>> print(list(zip(l1, l3))) [(1, 'x'), (2, 'y')] >>> print(dict(zip(l1,l3))) {1: 'x', 2: 'y'}
  • 實際上 zip 方法支持所有可迭代對象(字符串、列表、元祖、字典),而不僅僅是列表。利用這個特性,可以很容易創建各種字典,包括很復雜的字典。如下所示,注意 zip 對象支持直接遍歷,不需要先轉成 list 或 dict:
>> > l1 = [1, 2, 3] >> > str1 = "abc" >> > print(dict(zip(l1, str1))) {1: 'a', 2: 'b', 3: 'c'} >> > name = ["John", "Jim", "Lucy"] >> > year = [1983, 1985, 1995] >> > birth_year = dict(zip(name, year)) >> > print(birth_year) {'John': 1983, 'Jim': 1985, 'Lucy': 1995} >> > for name, year in zip(name, year):print("{} - {}".format(name, year))John - 1983 Jim - 1985 Lucy - 1995

八、利用 zip 方法實現鍵值反轉

  • 上文提到 zip 方法支持所有可迭代對象,也自然支持 dict.values() 和 dict.keys(),利用這個特性可以快速實現一個字典的鍵值反轉,如下所示:
>>> d1 = {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2, } >>> d2 = dict(zip(d1.values(), d1.keys())) >>> print(d2) {4: 'key1', 5: 'key2', 2: 'key4'}
  • 為什么使用 zip 方法后字典少了一個鍵? 還記得之前提到過鍵名必需唯一嗎? 可見 zip 方法對字典數據進行反轉必需考慮值相同而導致數據丟失的問題。

九、單個字典根據鍵名或值排序

  • 使用 sorted 方法可以對單個字典的鍵名進行正向或逆向排序(reverse=True),得到是一個排過序的鍵名列表。然后通過使用 for key in sorted(d)遍歷排過序的鍵從而得到排過序的值。
>>> d1 = {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2, } >>> d3 = sorted(d1) >>> print(d3) ['key1', 'key2', 'key3', 'key4'] >>> print(sorted(d1, reverse=True)) ['key4', 'key3', 'key2', 'key1']>>> for key in sorted(d1):print(d1[key]) 4 5 4 2
  • 如果希望根據值來排序,一般有 2 種方法:
    • 利用zip方法構建鍵值反轉字典再排序;
    • 使用匿名函數 lambda,此方法通常是一種更好的方法。
  • 使用 zip 方法反轉字典:
>>> d1 = {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2, } >>> d2 = dict(zip(d1.values(), d1.keys())) >>> print(list(d2.keys())) [4, 5, 2] >>> for key in sorted(d2):print(d2[key])key4 key1 key2
  • 由于使用 zip 方法導致了數值的缺失,一個更好的方法是使用 lambda 函數指定 key 來排序。
  • 使用 lambda 匿名函數,該方法設置排序的 key 為 d1[k],即每個鍵值對的值來排序:
>>> d1 = {'key3': 4, 'key2': 5, 'key1': 4, 'key4': 2, } >>> d2 = sorted(d1, key=lambda k: d1[k]) >>> print(d2) ['key4', 'key3', 'key1', 'key2'] >>> for key in d2:print(d1[key])2 4 4 5

十、字典的運算

  • 假設有如下兩個字典,能實現直接相加或相減嗎? 答案是不能的。Python 3并不支持字典的直接相加或相減,如果要合并兩個字典,需要使用 dict.update() 方法:
>>> d1 = {'key1':1, 'key2':7} >>> d2 = {'key1':3, 'key3':4}
  • 雖然 Python 不支持加減運算,但支持針對 keys() 和 values() 類似集合的運算, 可以用來求同求異,代碼如下所示:
>>> d1.keys() & d2.keys() {'key1'} >>> d1.keys() - d2.keys() {'key2'}
  • 有沒有發現字典的默認運算一般是針對鍵進行的?

十一、提取字典子集

  • 假設有如下一個字典(姓名->分數),需要提取分數大于 60 的鍵值對組成一個新的字典子集,那么應該怎么辦呢?
d = {'John':50, 'Mary': 65, 'Kitty':90, 'Tom': 100}
  • 最好最快的方式就是使用字典推倒表達式,方法如下:
>>> d = {'John':50, 'Mary': 65, 'Kitty':90, 'Tom': 100} >>> sub_d = { key:value for key, value in d.items() if value >= 60 } >>> print(sub_d) {'Mary': 65, 'Kitty': 90, 'Tom': 100}

十二、字典列表的排序

  • 實際應用中更常見的是對字典列表排序,而不是對當個字典的鍵或值進行排序。假設有一個字典列表,想根據某個或某幾個字典字段來排序這個列表,這時需要使用 operator 模塊的 itemgetter 函數,可以非常容易的排序這樣的數據結構。假設從數據庫中檢索出來網站會員信息列表,并且以下列的數據結構返回:
rows = [{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}]
  • 根據任意的字典字段來排序輸入結果行是很容易實現的,代碼示例:
from operator import itemgetterrows_by_fname = sorted(rows, key=itemgetter('fname'))print(rows_by_fname)
  • 代碼的輸出如下,注意該方法返回的直接排過序的完整字典,而不是排過序的鍵名列表:
[{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'},{'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'},{'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'}]
  • itemgetter() 函數也支持多個 keys,如下:
rows_by_lfname = sorted(rows, key=itemgetter('lname','fname'))print(rows_by_lfname)
  • 輸出如下:
[{'fname': 'David', 'uid': 1002, 'lname': 'Beazley'},{'fname': 'John', 'uid': 1001, 'lname': 'Cleese'},{'fname': 'Big', 'uid': 1004, 'lname': 'Jones'},{'fname': 'Brian', 'uid': 1003, 'lname': 'Jones'}]

十三、字典列表的去重

  • 假設有如下一個字典列表,需要實現字典值的去重,即提取所有獨特的值組成一個列表,那么一個最好的方式就是使用列表表達式:
>>> d1 = [{'key1':2}, {'key1':3}, {'key2': 2}, {'key3':4}] >>> u_value = set(val for dict in d1 for val in dict.values()) >>> print(list(u_value)) [2, 3, 4]
  • 同樣,可以使用列表表達式提取所有獨特的鍵名組成一個列表:
>>> d1 = [{'key1':2}, {'key1':3}, {'key2': 2}, {'key3':4}] >>> u_key = set(key for dict in d1 for key in dict.keys()) >>> print(list(u_key)) ['key2', 'key3', 'key1']

總結

以上是生活随笔為你收集整理的Python之字典类型数据常见操作及排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。