首頁  >  文章  >  後端開發  >  Python集合(set)類型的操作總結

Python集合(set)類型的操作總結

高洛峰
高洛峰原創
2016-10-20 10:15:331538瀏覽

python的set和其他語言類似, 是一個無序不重複元素集, 基本功能包括關係測試和消除重複元素. 集合對象還支持union(聯合), intersection(交), difference(差)和sysmmetric difference(對稱差集)等數學運算.

sets 支援x in set, len(set),和for x in set。作為一個無序的集合,sets不記錄元素位置或插入點。因此,sets不支援 indexing, slicing, 或其它類別序列(sequence-like)的操作。

下面來點簡單的小例子說明把。

>>> x = set('spam')

>>> y = set(['h','a','m'])

>>> x, y

(set([ 'a', 'p', 's', 'm']), set(['a', 'h', 'm']))

再來些小應用。

>>> x & y # 交集

set(['a', 'm'])

>>> x | y # 並集

set(['a', 'p', 's ', 'h', 'm'])

>>> x - y # 差集

set(['p', 's'])

記得以前個網友提問怎麼去除海量列表裡重複元素,用hash來解決也行,只不過感覺在性能上不是很高,用set解決還是很不錯的,示例如下:

>>> a = [11,22,33,44,11,22]

>>> b = set(a)

>>> b

set([33, 11, 44, 22])

>>> c = [i for i in b]

>>> c>>>

[33, 11, 44, 22]

很酷把,幾行就可以搞定。

1.8 集合

集合用於包含一組無序的物件。要建立集合,可以使用set()函數並像下面這樣提供一系列的項目:

s = set([3,5,9,10])      #建立一個數值集合

t = set("Hello" )         #建立一個唯一字元的集合

與清單和元組不同,集合是無序的,也無法透過數字進行索引。此外,集合中的元素不能重複。例如,如果檢查前面程式碼中t集合的值,結果會是:

>>> t

set(['H', 'e', 'l', 'o'])

注意只出現了一'l'。

集合支援一系列標準作業,包括並集、交集、差集和對稱差集,例如:

a = t | s          # t 和s的並集

b = t & s    # t 和s的並集

b = t & s    #交集

c = t – s          # 求差集(項在t中,但不在s中)

d = t ^ s         # 差異項中)

基本操作:

t.add('x')            # 新增一項

s.update([10,37,42]) )可以刪除一項:

t.remove('H')

len(s)

set 的長度

x in s

測試x 是否是s 的成員

x 是否不是s 的成員

s.issubset(t)

s

測試是否s 中的每一個元素都在t 中

s.issuperset(t)

s >= t測試是否t 中的每一個元素都在s 中

s.union(t)

s | t

回傳一個新的set 包含s 和t 中的每一個元素

s.intersection(t)

s & t

返回一個新的set 包含s 和t 中的公共元素

s.difference(t)

s - t

返回一個新的set 包含s 中有但是t 中沒有的元素

s.symmetric_difference(t)

s ^ t

返回一個新的set 包含s 和t 中不重複的元素

s.copy()

:union(), intersection(), difference() 和symmetric_difference() 的非運算子(non-operator,就是形如s.union()這樣的)版本將會接受任何iterable 作為參數。相反,它們的運算子版本(operator based counterparts)要求參數必須是 sets。這可以避免潛在的錯誤,如:為了更可讀而使用 set('abc') & 'cbs' 來取代 set('abc').intersection('cbs')。從 2.3.1 版本中做的更改:以前所有參數都必須是 sets。

另外,Set 和 ImmutableSet 兩者都支援 set 與 set 之間的比較。兩個 sets 在也只有在這種情況下是相等的:每一個 set 中的元素都是另一個中的元素(二者互為subset)。一個 set 比另一個 set 小,只有在第一個 set 是第二個 set 的 subset 時(是一個 subset,但不相等)。一個 set 比另一個 set 打,只有在第一個 set 是第二個 set 的 superset 時(是一個 superset,但不相等)。

子 set 和相等比較並不會產生完整的排序功能。例如:任兩個 sets 都不相等也不互為子 set,因此下列的運算都會回傳 False:a

b。因此,sets 不提供 __cmp__ 方法。

因為 sets 只定義了部分排序功能(subset 關係),list.sort() 方法的輸出對於 sets 的列表沒有定義。

運算子

  運算結果

hash(s)

  回傳 s 的 hash 值

下面這個表列出了對於Set 可用二對於ImmutableSet 不可用的運算:

運算子(voperator)

等價於

運算結果

s.update(t)

運算結果

s.update(t)

運算結果

s.update(t)

運算結果

回傳增加了set “t”中元素後的set “s”

s.intersection_update(t)

s &= t

回傳只保留含有set “t”中元素的set “s”

s. difference_update(t)

s -= t

返回刪除了set “t”中含有的元素後的set “s”

s.symmetric_difference_update(t)

」或set 「s」中有而非兩者都有的元素的set 「s」

s.add(x)

向set 「s」增加元素x

s.remove(x)

從set “s”中刪除元素x, 如果不存在則引發KeyError

s.discard(x)

如果在set “s”中存在元素x, 則刪除

s.pop()

刪除並且返回set “s”中的一個不確定的元素, 如果為空則引發KeyError

s.clear()

刪除set “s”中的所有元素

請注意:非運算符版本的update() , intersection_update(), difference_update()和symmetric_difference_update()將會接受任意iterable 作為參數。從 2.3.1 版本做的更改:以前所有參數都必須是 sets。

也請注意:這個模組也包含一個 union_update() 方法,它是 update() 方法的一個別名。包含這個方法是為了向後相容。程式設計師應該多使用 update() 方法,因為這個方法也被內建的 set() 和 frozenset() 類型支援。 🎜🎜🎜🎜
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:元組轉字典下一篇:元組轉字典