集合
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'
是否為站長之一?同時是站長也是使用者的有誰?站長與使用者有哪些人?站 長中不是使用者的有誰?沒有同時具備站長與使用者身份的有誰?站長群是否為使用者群的父集?站長群是否為使用者群的子集?
對於集合物件,能使用 intersection
、union
、difference
、symmetric_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
迴圈可以用在集合物件,逐一取得集合中的元素,然而因為集合本身是無序的,無法確保元素的取得順序。