Python之字典與集合的介紹

2022-06-24 05:09:10 字數 3606 閱讀 7782

字典和集合為何總要放在一起,說來也巧,就是因為它們都用大括號 {} 包裹。

2.1 字典和集合那些基礎操作

2.1.1 先說字典

字典是由鍵值對組成的,鍵為 key,值為 value,標記一下,在 python3.6 之前字典是無需的,長度大小可變,元素也可以任意的刪除和改變,在 python 3.7 之後,字典有序了。

為了測試字典的無序性,我專門在 python 線上環境進行了測試,**如下:

my_dict = {}

my_dict["a"] = "a"

my_dict["b"] = "b"

my_dict["c"] = "c"

my_dict["d"] = "d"

for key in my_dict:

print(key)

執行結果也證明了無序性。

在本地 python 3.8 版本測試,沒有出現亂序的情況。

所以再有人問 python 裡面的字典有沒有順序呀,不要直接回答無序了,這玩意現在有順序。

字典這種鍵值對結構,相較於列表與元組更加適合新增元素、刪除元素、查詢元素等操作。

字典的建立不在細說,滾雪球第一遍學習的時候,已經涉及了,需要注意的是索引鍵的時候,如果鍵不存在,會出現 keyerror 錯誤,該錯誤屬於極其常見錯誤。

my_dict = {}

my_dict["a"] = "a"

my_dict["b"] = "b"

my_dict["c"] = "c"

my_dict["d"] = "d"

print(my_dict["f"])

錯誤提示如下:

traceback (most recent call last):

file ".\demo.py", line 7, in

print(my_dict["f"])

keyerror: 'f'

如果你不希望此異常出現,在索引鍵的時候使用 get(key,default) 函式即可。

print(my_dict.get("f","none"))

2.1.2 再聊集合

集合和字典基本結構相同,最大的區別是集合沒有鍵值對,它是一系列無序且唯一的元素組合。

集合不支援索引操作,也就是說下面的**肯定是會報錯的。

my_set =

print(my_set[0])

異常提示為型別錯誤:typeerror: 'set' object is not subscriptable。

其餘重點記憶的就是集合經常用在去重操作上,掌握即可。

2.2 字典與集合的排序

基本操作依舊不在過多解釋,需要的可以去第一遍滾雪球學習,這裡強調一下排序函式,因為涉及了一些擴充套件知識點,可以先接觸一下,後面對於部分內容還會細講。

學習之前,你要記住,對集合進行 pop 操作,得到的元素是不確定的,因為集合無序,具體你可以測試如下**:

my_set =

print(my_set.pop())

如果希望對字典排序,按照咱們已知的技術,可以這樣進行。

以下內容為 python3.6 版本以下執行結果。

直接使用 sorted 函式即可對字典排序,排序的時候,還可以指定按照鍵或者值進行排序,例如按照字典值公升序排序。

my_dict = {}

my_dict["a"] = "4"

my_dict["b"] = "3"

my_dict["c"] = "2"

my_dict["d"] = "1"

sorted_dict = sorted(my_dict.items(),key=lambda x:x[1])

print(sorted_dict)

輸出結果如下,得到的結果是按照字典的值進行排序的,這裡需要注意的是 lambda 匿名函式在後續的課程將逐步展開

[('d', '1'), ('c', '2'), ('b', '3'), ('a', '4')]

集合排序無特別說明,直接使用 sorted 函式即可。

2.3 字典與集合的效率問題

字典與集合的效率問題,主要對比的物件是列表,假設現在有一堆學號和體重的資料,咱們需要判斷出不同體重數的學生人數。

需求描述如下:

有 4 個學生,按照學號排序形成的元組為 (1,90),(2,90),(3,60),(4,100),最終的結果輸出 3(存在三個不同的體重)

按照需求編寫**如下:

列表寫法大連**醫院哪家好

def find_unique_weight(students):

# 宣告乙個統計列表

unique_list =

# 迴圈所有學生資料

for id, weight in students:

# 如果體重沒有在統計列表中

if weight not in unique_list:

# 新增體重資料

# 計算列表長度

ret = len(unique_list)

return ret

students = [

(1, 90),

(2, 90),

(3, 60),

(4, 100)

print(find_unique_weight(students))

接下來上述**修改為集合寫法

def find_unique_weight(students):

# 宣告乙個統計集合

unique_set = set()

# 迴圈所有學生資料

for id, weight in students:

# 集合會自動過濾重複資料

unique_set.add(weight)

# 計算集合長度

ret = len(unique_set)

return ret

**寫完之後,並未發現有太大的差異,但是如果把資料擴大到更大的兩集,例如上萬資料。

以下**時間計算函式應用的是 time.perf_counter() 該函式第一次呼叫時,從計算機系統裡隨機選乙個時間點 a,計算其距離當前時間點 b1 有多少秒。當第二次呼叫該函式時,預設從第一次呼叫的時間點 a 算起,距離當前時間點 b2 有多少秒。兩個函式取差,即實現從時間點 b1 到 b2 的計時功能,首先結合列表計算的函式,執行下述**

import time

id = [x for x in range(1, 10000)]

# 體重資料為了計算,也只能從 1 到 10000 了

weight = [x for x in range(1, 10000)]

students = list(zip(id, weight))

start_time = time.perf_counter()

# 呼叫列表計算函式

find_unique_weight(students)

end_time = time.perf_counter()

print("運算時間為:{}".format(end_time - start_time))

執行時間為 1.7326523,每台電腦執行速度不一致,具體看差異。

修改上述**執行到集合編寫的函式上,最終得到的結果為 0.0030606,可以看到在 10000 條資料的量級下就已經產生了如此大的差異,如果數量級在進行上公升,差異會再次加大。

Python之字典與集合

字典使用名稱 內容進行資料結構的構建,在python中分別對應著鍵 key 值 value 習慣上稱為鍵值對,下面舉個例子 city popularity 上面就是字典的寫法,那麼我們來一一試驗字典的性質 city popularity city popularity 深圳 fourth print...

python之集合與字典

用索引關鍵字 brand 鯉魚 校園 西安市 fill daa vxx poo print 西安市對應的是 fill brand.index 西安市 用字典 dict1 print 校園對應的為 dict1 校園 dict2 print dict2 2 dict3 dict f 1 a 2 prin...

python之字典與集合

1 字典中每一條資料都是有乙個鍵值對來組成 key value 2 空字典的定義 dic 2 取值 dic key value 1 通過鍵直接賦值,可以直接新增元素,對已存在的鍵,可以修改對應的資料 2 字典一次性新增多個元素 dic.update print dic.keys dict keys ...