內置數據結構set
定義: 可變的、無序的、不重複的元素的集合. 常用於: 去重 set是可迭代對象 set中的元素必須是可hash的 set中的值不能通過索引訪問
set定義,初始化
set() -> new empty set object set(iterable) -> new set object 注意: 定義set時,可用{}來表示,但不能爲空 如下: >>> type({}) # '{}'表示定義的是dict <class 'dict'> >>> type({1}) <class 'set'>
set方法
增
add(elem) 添加一個元素至set update(*others) 將可迭代對象添加至set
刪
remove(elem) 刪除set中指定的元素,如果找不到拋出KeyError discard(elem) 刪除set中指定的元素,如果找不到,就什麼都不做 pop() --> elem 隨機彈出set中某元素,並輸出至標準輸出 如果找不到拋出KeyError clear() 清空set內所有元素 問: 爲什麼拋出的異常是KeyError,而不是ValueError? 說明set是通過Key來查詢值是否存在,而不是通過value的對比.
查
非線性結構,無法索引
改
修改,還不如直接刪除,再增一個新元素
set成員運算符比較
比較set和list查詢效率: lst1 = list(range(100)) lst2 = list(range(1000000)) -1 in lst1、-1 in lst2 # 使用此語句測試效率 s1 = set(range(100)) s2 = set(range(1000000)) -1 in s1、-1 in s2 # 使用此語句測試效率 測試結果: list相差數量級的倍數 set相差無幾
set和線性結構
線性結構在查詢效率方面,查詢的數據的量級越大,所消耗的時間則會越多. set、dict等,內部使用hash作爲key,在查詢上時間複雜度爲O(1).即查詢時間,跟數據量級無關.
可hash對象
整型
字符型
tuple
None
bytes(保存的是對應的字符編碼)
使用內置的hash()函數來判斷此對象是否是可hash的.
例:
>>> hash([1]) # 列表不可hash
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'