橡皮擦,一個逗趣的互聯網高級網蟲,新的系列,讓我們一起
Be More Pythonic,
二、字典與集合那些事兒
字典和集合為何總要放在一起,說來也巧,就是因為它們都用大括號 {} 包裹,
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 <module>
print(my_dict["F"])
KeyError: 'F'
如果你不希望此例外出現,在索引鍵的時候使用 get(key,default) 函式即可,
print(my_dict.get("F","None"))
2.1.2 再聊集合
集合和字典基本結構相同,最大的區別是集合沒有鍵值對,它是一系列無序且唯一的元素組合,
集合不支持索引操作,也就是說下面的代碼肯定是會報錯的,
my_set = {"A","B","C"}
print(my_set[0])
例外提示為型別錯誤:TypeError: 'set' object is not subscriptable,
其余重點記憶的就是集合經常用在去重操作上,掌握即可,
2.2 字典與集合的排序
基本操作依舊不在過多解釋,需要的可以去第一遍滾雪球學習,這里強調一下排序函式,因為涉及了一些擴展知識點,可以先接觸一下,后面對于部分內容還會細講,
學習之前,你要記住,對集合進行 pop 操作,得到的元素是不確定的,因為集合無序,具體你可以測驗如下代碼:
my_set = {"A","B","C"}
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:
# 新增體重資料
unique_list.append(weight)
# 計算串列長度
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 條資料的量級下就已經產生了如此大的差異,如果數量級在進行上升,差異會再次加大,所以你了解到該用什么內容了嗎?
2.4 這篇博客的總結
這篇博客,我們對字典與集合相關的知識進行了補充,有一個知識橡皮擦依舊進行了略過,就是字典與集合的存盤原理,具體會涉及到哈希表結構相關知識,這部分對初級應用影響不大,所以暫時略過,對于字典與集合來說,如果你在撰寫程式中需要高效查找資料、去重資料,建議及時的把二者應用起來,
相關閱讀
- Python 爬蟲 100 例教程,超棒的爬蟲教程,立即訂閱吧
- Python 爬蟲小課,精彩 9 講
今天是持續寫作的第 93 / 100 天,
如果你想跟博主建立親密關系,可以關注同名公眾號 夢想橡皮擦,近距離接觸一個逗趣的互聯網高級網蟲,
博主 ID:夢想橡皮擦,希望大家點贊、評論、收藏,
CSDN認證博客專家
高級產品經理
互聯網從業者
業余編程愛好者
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/264839.html
標籤:python
