1. 程式人生 > >【Python】set() 集合操作與運算 && 元素輸出順序

【Python】set() 集合操作與運算 && 元素輸出順序

集合 | SET

集合(set)是Python中一種重要的資料型別,表示一組各不相同元素的無序集合,其主要應用於重複元素消除及關係測試等
集合在Python內部通過雜湊表實現,其本徵無序,輸出時所顯示的順序具有隨機性,且與執行環境相關


操作與運算

主要包括基於不同物件的建立、元素級的運算及包含關係、集合間的運算及包含關係等

建立集合

  • 列表
a = [2, 3, 4, 2, 1]
set_a = set(a)
print (set_a)

輸出:{1, 2, 3, 4}
重複的 2 只出現了一次

  • 字串
b = 'sdgdfgeyoz'
set_b = set(b) print (set_b)

輸出:{‘f’, ‘e’, ‘z’, ‘o’, ‘d’, ‘s’, ‘y’, ‘g’}
重複的 ‘d’ 和 ‘g’ 都只出現了一次

元素運算

  • 新增元素:
set_a.add(x) # 將元素x作為一個整體,新增到set_a中
set_b.update(x) # 將元素x執行set(x),拆分為個體,再新增到set_a中
  • 刪除元素:
set_a.remove(x) # 從set_a中刪除元素x, 如果不存在則丟擲KeyError
set_a.discard(x) # 如果在set_a中存在元素x, 則刪除
set_a.pop() # 刪除並且返回set_a中的一個不確定的元素, 如果set_a為空則丟擲KeyError set_a.clear() # 清除set_a中的所有元素

元素包含關係

x in set_x # x在set_x中?
y not in set_x # y不在set_x中?

輸出返回 True 或 False

集合運算

  • 並集,包含set_a和set_b中的所有元素:
set_a | set_b
set_a.union(set_b)
set_a.update(set_b) # 自我更新不返回新物件,即set_a |= set_b
  • 交集
    ,包含set_a和set_b中的共有元素:
set_a & set_b
set_a.intersection(set_b)
set_a.intersection_update(set_a) # 自我更新不返回新物件,即set_a &= set_b
  • 差集,包含set_a中有而set_b沒有的元素:
set_a - set_b
set_a.difference(set_b)
set_a.difference_update(set_a) # 自我更新不返回新物件,即set_a -= set_b
  • 對稱差集,包含set_a和set_b中不重複的所有元素:
set_a ^ set_b
set_a.symmetric_difference(set_b)
set_a.symmetric_difference_update(set_b) # 自我更新不返回新物件,即set_a ^= set_b
  • 返回set_a的一個複製:
set_a.copy()

集合包含關係

set_a.issubset(set_b) # set_a是set_b的子集?
set_a.issuperset(set_b) # set_a是set_b的超集?

輸出返回 True 或 False


元素輸出順序

集合在Python內部通過雜湊表實現,其本徵無序
列印輸出的時候需要遍歷雜湊表的每一個bucket,這時候哪個bucket在前面,其對應的元素就排在前面
因此,在不同計算機上或在同一計算機上的不同次執行結果的輸出順序通常都會不一樣

原生Python

原生Python下,相同計算機上同次執行的輸出結果相同,不同次執行的輸出順序通常不同

同一計算機上原生Python的不同次執行

IPython

IPython是一個基於Python Shell的互動式直譯器,但有比預設Shell強大得多的編輯和互動功能
IPython下,由於經過了包裝與美化,set/dict的螢幕輸出預設會經過排序,因而每次執行的輸出順序都相同
然而由於set本身無序,不能對set取index,因而IPython中的按序輸出除了看起來更舒服以外,並沒有實質上的作用

同一計算機上IPython的不同次執行

列表去重排序

  • 對列表去重,並排序
set_a = set(list_a)
list_a_s = list(set_a)
list_a_s.sort()
  • 對列表去重,並保持原有的順序
mail_to = ['cc', 'bbbb', 'afa', 'sss', 'bbbb', 'cc', 'shafa']
addr_to = list(set(mail_to))
addr_to.sort(key = mail_to.index)

輸出addr_to為:[‘cc’, ‘bbbb’, ‘afa’, ‘sss’, ‘shafa’]


References

  1. python基礎學習——列表(list), 元祖(tuple), 字典(dict), 字串(string), 集合(set) 介紹及相互轉換
  2. Python 集合set()新增刪除、交集、並集、集合操作詳解
  3. How is set implemented internally in python?
  4. python 使用set對列表去重,並保持列表原來順序

希望能夠對大家有所幫助~