集合

April 11, 2022

在 Python 中,集合(set)是無序、元素不重複的集合。

集合操作

要建立集合,可以使用 {} 包括元素的實字方式來建立集合。例如:

>>> admins = {'Justin', 'caterpillar'}
>>> users = {'momor', 'hamini', 'Justin'}
>>> 'Justin' in admins
True
>>> admins & users
{'Justin'}
>>> admins | users
{'hamini', 'caterpillar', 'Justin', 'momor'}
>>> admins - users
{'caterpillar'}
>>> admins ^ users
{'hamini', 'caterpillar', 'momor'}
>>> admins > users
False
>>> admins < users
False
>>>

建立集合後,可以使用 in 來測試元素是否在集合中,使用 & 交集(intersection)運算,使用 | 聯集(union)運算,使用 - 作減集(difference)運算,使用 ^ 作排它(exclusive or)運算,使用 > 測試左集合是否為右集 合的父集,使用 < 測試左集合是否為右集合的子集。

在上例中,利用集合依序測試,'Justin' 是否為站長之一?同時是站長也是使用者的有誰?站長與使用者有哪些人?站 長中不是使用者的有誰?沒有同時具備站長與使用者身份的有誰?站長群是否為使用者群的父集?站長群是否為使用者群的子集?

對於集合物件,能使用 intersectionuniondifferencesymmetric_difference 等方法來進行對應的集合操作。

如果要建立空集合,必須使用 set 類別建構,因為只寫 {} 的話,在 Python 代表空字典(dict)。例如:

>>> type({})
<class 'dict'>
>>> type(set())
<class 'set'>
>>> family = set()
>>> family
set()
>>> family.add('Justin')
>>> family.add('Momor')
>>> family.add('Hamimi')
>>> family
{'Hamimi', 'Justin', 'Momor'}
>>>

如果要從字串的字元或清單的元素建立集合物件,可以使用 set 來建構。例如:

>>> set('Justin')
{'i', 'J', 'n', 's', 'u', 't'}
>>> set([1, 2, 3, 4])
{1, 2, 3, 4}
>>> {'Justin'}
{'Justin'}
>>> {[1, 2, 3, 4]}
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>>

hashable 元素

{'Justin'} 會將整個字串放在集合中,而 {[1, 2, 3, 4]} 會出錯,Python 的集合物件要求元素是 hashable,也就是必須實作 __hash____eq__ 方法,清單都不是 hashable,集合也不是:

>>> family = {'Justin'}
>>> family
{'Justin'}
>>> family.add({'Momor', 'Hamini'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> family.update({'Momor', 'Hamini'})
>>> family
{'Hamini', 'Justin', 'Momor'}
>>>

update 方法可以合併集合,它是將原集合的元素取出,再加入目標集合,你也可以自己來做:

>>> family = {'Justin'}
>>> for person in {'Momor', 'Hamini'}:
...     family.add(person)
...
>>> family
{'Hamini', 'Justin', 'Momor'}
>>>

for 迴圈可以用在集合物件,逐一取得集合中的元素,然而因為集合本身是無序的,無法確保元素的取得順序。

分享到 LinkedIn 分享到 Facebook 分享到 Twitter