天天看點

【python】集合操作set函數去重與集合、數組、元組中交集(intersection)、并集(union)、差集(difference)、對稱差集(sysmmetric difference)

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

sets 支援 x in set的bool運算判别x是否在集合内, len(set)集合的長度,和 for x in set對集合内資料的操作。作為一個無序的集合,sets不記錄元素位置或者插入點。是以,sets**不支援 indexing, slicing**, 或其它類序列(sequence-like)的操作。

集合用于包含一組無序的對象。要建立集合,可使用set()函數并像下面這樣提供一系列的項:

In []: s = set([,,,])      #建立一個數值集合

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

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

In []: t
Out[]: {'H', 'e', 'l', 'o'}
           

集合支援一系列标準操作,包括并集、交集、差集和對稱差集,例如:

  • a = t | s # t 和 s的并集
  • b = t & s # t 和 s的交集
  • c = t – s # 求差集(項在t中,但不在s中)
  • d = t ^ s #對稱差集(項在t或s中,但不會同時出現在二者中)

基本操作:

1、添加新的元素,.add()用于添加單個元素、.update()用于批量添加元素,如果喂給add的是‘avda’這種多字元串可以成為一個元素,但是喂給update會對字元串去重操作

In []: t.add('x')
In []: t
Out[]: {'H', 'e', 'l', 'o', 'x'}

In []: t.update('aa','bbb')
In []: t
Out[]: {'H', 'a', 'b', 'e', 'l', 'o', 'x'}

In []: t.add('ccc')
In []: t
Out[]: {'H', 'a', 'b', 'ccc', 'e', 'l', 'o', 'x'}
           

2、使用remove()可以删除一項,隻能一個一個删掉

In [12]: t.remove('H')
In []: t
Out[]: {'a', 'b', 'ccc', 'e', 'l', 'o', 'x'}
           

3、集合長度

In [15]: len(t)
Out[15]: 7
           

4、bool判斷

#x in s  測試 x 是否是 s 的成員  
In []: 'a' in t
Out[]: True

#x not in s 測試 x 是否不是 s 的成員  
In []: 'k' not in t
Out[]: True

#s.issubset(t),s <= t 測試是否s中的每一個元素都在t中  
In []: s.issubset(t)
Out[]: False 
#s.issuperset(t),s >= t測試是否t中的每一個元素都在s中
In []: s.issuperset(t)
Out[]: False 
           

5、交集(&)、(intersection)項同時在t與s中

In []: s&t
Out[]: set()
In []: s.intersection(t)
Out[]: set()
           

6、并集(|)、(union),項在t中或者在s中

In []: s|t
Out[]: {'a', , , 'ccc', 'e', , , 'l', 'o', 'x', 'b'}

In []: s.union(t)
Out[]: {'a', , , 'ccc', 'e', , , 'l', 'o', 'x', 'b'}
           

7、差集(-)、(difference),項在s中,但不在t中

In [24]: s-t
Out[24]: {3, 5, 9, 10}

In [25]: s.difference(t)
Out[25]: {3, 5, 9, 10}
           

8、對稱差集(^)、(sysmmetric_difference),項在t或s中,但不會同時出現在二者中

In []: s^t
Out[]: {'a', , , , , 'o', 'x', 'ccc', 'e', 'l', 'b'}

In []: s.symmetric_difference(t)
Out[]: {'a', , , , , 'o', 'x', 'ccc', 'e', 'l', 'b'}
           

請注意:union(), intersection(), difference() 和 symmetric_difference() 的非運算符(non-operator,就是形如 s.union()這樣的)版本将會接受任何 iterable 作為參數。相反,它們的運算符版本(operator based counterparts)要求參數必須是 sets,如果都是set會報錯。

In [29]: set('abc') & 'cbs'
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input--caf> in <module>()
---->  set('abc') & 'cbs'

TypeError: unsupported operand type(s) for &: 'set' and 'str'

#如果是非運算符,則可以;
In []: set('abc').intersection('cbs')
Out[]: {'b', 'c'}