python數據結構之 set

 

在數學概念中,被意爲整合元素的定義區域python

在python中,set最大的做用是用來去重ide

 

set常見操做:oop

In [158]: s ={1,1,1,1,2,22,33,3,3,3}spa

 

In [159]: s對象

Out[159]: {1,2, 3, 22, 33}索引

 

在定義一個集合的時候,只能使用大括號定義最少一個值,否則會被認爲字典進行定義ip

在set中不能加入不可哈希的對象類型內存

 

In [161]:hash('a')rem

Out[161]:4952964627402403516字符串

 

查看列表的哈希值,能夠發現這個對象不可被哈希

In [162]: a =[1,2,3]

 

In [163]:hash(a)

---------------------------------------------------------------------------

TypeError                               Traceback (most recent call last)

<ipython-input-163-fe724719d9a1>in <module>()

----> 1hash(a)

 

TypeError:unhashable type: 'list'

 

set元素必須是能夠哈希運算,可是須要元素能夠迭代的

只要是能被迭代的元素均可以被加入到set中

In [171]:list(s)

Out[171]:['abc', b'abc']

 

In [172]: a =list(s)

 

In [173]: a

Out[173]:['abc', b'abc']

 

In [174]:set(a)

Out[174]:{'abc', b'abc'}

 

set.add增長元素

增長一個元素到set中,若是存在則什麼都不作,由於存在其值

In [176]:s.add(1)

 

In [177]: s

Out[177]: {1,'abc', b'abc'}

 

In [178]:s.add(2)

 

In [179]: s

Out[179]: {1,'abc', 2, b'abc'}

set能夠收集多個集合,一樣的能夠合併多個集合

 

使用update進行更新

 

In [180]:s.update({1,2,3},{5,7},(1,9,1))

In [181]: s

Out[181]: {1,'abc', 2, b'abc', 3, 5, 7, 9}

 

In [185]:s.update({1})

 

In [186]: s

Out[186]: {1,'abc', 2, b'abc', 3, 5, 7, 4, 9}

 

In [187]:s.update({10})

 

In [188]: s

Out[188]: {1,'abc', 2, b'abc', 3, 5, 7, 4, 9, 10}

 

set.remove刪除

remove,將要刪除的值轉爲hash,並按當前hash值定位其位置進行刪除,這個hash將做爲一個key進行操做

 

In [193]: s

Out[193]: {1,2, b'abc', 3, 5, 7, 4, 9, 10}

 

In [194]:s.remove(b'abc')

 

In [195]: s

Out[195]: {1,2, 3, 4, 5, 7, 9, 10}

 

查找元素的過程是很是快,由於是直接定義hash,並不是是從頭至尾去遍歷

 

discard 從集合移除一個元素

與remove功能同樣,可是discard並不會彈出異常:

remove 刪除一個異常索引會報出keyerror

In [196]:s.remove('hahaha')

---------------------------------------------------------------------------

KeyError                                Traceback (most recent call last)

<ipython-input-196-185a5cf4c543>in <module>()

----> 1s.remove('hahaha')

 

KeyError:'hahaha'

 

discard 刪除一個索引則不會返回任何信息

In [197]:s.discard('hahaha')

 

In [198]:

 

pop  隨機挑選一個彈出並返回

pop只是隨機彈出,並不能跟參數

In [202]:s.pop()

Out[202]: 2

 

In [203]:s.pop()

Out[203]: 3

 

In [204]: s

Out[204]: {4,5, 7, 9, 10}

 

clear  清除集合內全部元素,可是要考慮GC內存回收問題

 

set修改及查詢

在set中沒有修改的概念,只有兩種操做:

刪除元素 和追加元素

查詢:非線性結構,沒法進行索引查詢

遍歷:能夠遍歷全部可迭代的元素

 

成員運算符

成員運算符 in , not in ,效率很高

非線性結構若是找哈希值,時間複雜度至關於索引遍歷列表大O(1)

看似經過值在遍歷,其實是用哈希值進行定位

 

可哈希的類型

數值型:int、float、complex

布爾類:True、False

字符串: str Bytes

Tuple、None都是不可變類型,稱爲哈希類型

 

對比list和set執行效率

 

查看set執行效率

導入模塊timeit

import timeit

 

In [3]:%%timeit lst1 = set(range(1000))

  ...: a = -1 in lst1

  ...:

 

38.1 ns ± 0.0493 ns per loop(mean ± std. dev. of 7 runs, 10000000 loops each)

 

查看list效率

In [1]:%%timeit lst1 = list(range(1000))

  ...: a = -1 in lst1

  ...:

14.7 μs ± 99.3ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)


總結:

線性結構查詢的複雜度是O(n), 隨着規模增大耗時間愈來愈高

set和字典都屬於特殊結構,其中都存了hash做爲key,時間複雜度能夠作到O(1),查詢時間與數據規模無關

相關文章
相關標籤/搜索