本章目錄
- Part One:基本概念
- Part Two:常用方法
- Part Three:不可變集合
基本概念
集合Set的原理和字典比較類似确镊,也是一組key的集合缸兔,但是沒有value,所以從實(shí)現(xiàn)上看起來又和列表類似。
Set具有字典的大部分特性,比如Set也是無序的扁掸,不能保證元素的添加順序回窘,只能存入不可變元素等诺擅。另外,Set最重要的一個特性就是它的元素是唯一的啡直,如果存在兩個同樣的元素的時候烁涌,Python只會保存其中的一個。
- 集合初始化
# set方法初始化集合
set_nba = set(["Miami Heat", "Cleveland Cavaliers", "Houston Rockets", "Golden State Warriors"])
print(set_nba)
# {}方式初始化集合
tarena_train = {"Java", "Android", "Python", "Android"}
# 打印結(jié)果可知酒觅,"Android"這個重復(fù)項(xiàng)只會保留一個
print(tarena_train)
結(jié)果為:
{'Golden State Warriors', 'Cleveland Cavaliers', 'Miami Heat', 'Houston Rockets'}
{'Python', 'Android', 'Java'}
- 空集合
set_temp = set()
print(type(set_temp))
# set方法只有一種空集合創(chuàng)建方式就是set方法
# {}只會創(chuàng)建字典dict
empty = {}
print(type(empty))
結(jié)果為:
<class 'set'>
<class 'dict'>
- 集合操作
set可以看成數(shù)學(xué)意義上的無序和無重復(fù)元素的集合撮执,因此,兩個set可以做數(shù)學(xué)意義上的交集舷丹、并集等操作:
set1 = set(["Java", "Android", "Python", "C"])
set2 = set(["C", "PHP", "IOS", "C#"])
# 兩個集合的并操作抒钱,即返回兩個集合的所有元素,并去掉重復(fù)的集合
print("兩個集合的并操作(union方法)颜凯,結(jié)果為:", set1.union(set2))
print("兩個集合的并操作(|操作符)谋币,結(jié)果為:", set1 | set2)
print("=======================================華麗的分割線=======================================")
# 兩個集合的交操作,即返回兩個集合相同的元素組成的集合
print("兩個集合的交操作(intersection方法)症概,結(jié)果為:", set1.intersection(set2))
print("兩個集合的交操作(&操作符)蕾额,結(jié)果為:", set1 & set2)
print("=======================================華麗的分割線=======================================")
# 兩個集合的差操作,返回只在第一個集合彼城,而不在第二個結(jié)合的元素組成的集合
print("set1在前诅蝶,set2在后的差操作(difference方法)退个,結(jié)果為:", set1.difference(set2))
print("set2在前,set1在后的交操作(-操作符)调炬,結(jié)果為:", set2 - set1)
print("=======================================華麗的分割線=======================================")
# 兩個集合的對稱差操作, 返回不同時存在于兩個集合中的元素組成的集合
print("兩個集合的對稱差操作(symmetric_difference方法)语盈,結(jié)果為:", set1.symmetric_difference(set2))
print("兩個集合的對稱差操作(^操作符),結(jié)果為:", set2 ^ set1)
結(jié)果為:
兩個集合的并操作(union方法)筐眷,結(jié)果為: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP', 'C'}
兩個集合的并操作(|操作符)黎烈,結(jié)果為: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP', 'C'}
=======================================華麗的分割線=======================================
兩個集合的交操作(intersection方法),結(jié)果為: {'C'}
兩個集合的交操作(&操作符)匀谣,結(jié)果為: {'C'}
=======================================華麗的分割線=======================================
set1在前照棋,set2在后的差操作(difference方法),結(jié)果為: {'Java', 'Python', 'Android'}
set2在前武翎,set1在后的交操作(-操作符)烈炭,結(jié)果為: {'PHP', 'IOS', 'C#'}
=======================================華麗的分割線=======================================
兩個集合的對稱差操作(symmetric_difference方法),結(jié)果為: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP'}
兩個集合的對稱差操作(^操作符)宝恶,結(jié)果為: {'IOS', 'Java', 'Python', 'Android', 'C#', 'PHP'}
常用方法
- add方法添加元素
tarena_train = set(["Java", "Android", "Python"])
# add方法向集合添加元素符隙,可以添加不同類型的元素,但是必須是不可變的
tarena_train.add("C")
tarena_train.add(1)
print(tarena_train)
結(jié)果為:
{1, 'Android', 'Python', 'C', 'Java'}
- update方法添加多個元素
tarena_train = set(["Java", "Android", "Python"])
# update方法向集合添加元素垫毙,可以同時添加多個霹疫,并去重
tarena_train.update(["Java", "C#", "PHP"])
temp = {"Java", "C", ".net"}
tarena_train.update(temp)
print(tarena_train)
結(jié)果為:
{'C#', 'Python', 'Java', 'C', 'Android', 'PHP', '.net'}
- remove,pop和discard方法移除元素
tarena_train = set(["Java", "C", "Android", "Python"])
temp = set(["Android", "Java", "Python"])
# remove方法移除元素综芥,無返回值丽蝎,如果元素不存在會報錯
print(tarena_train.remove("Java"))
# pop方法移除元素,返回值為該移除的元素
# 移除的位置是隨機(jī)的膀藐,也就是說同樣的代碼每次執(zhí)行結(jié)果可能不一樣
# 如果集合為空屠阻,則會報錯
print(tarena_train.pop())
# discard方法移除元素,無返回值额各,如果元素不存在不會報錯
print(tarena_train.discard("Android"))
print(tarena_train)
結(jié)果為:
None
C
None
{'Python'}
- difference_update刪除多個元素
tarena_train = set(["Java", "Android", "Python"])
tarena_train.update(["Java", "C#", "PHP"])
print(tarena_train)
# difference_update方法是從集合中刪除相同的元素国觉,多用于多個元素刪除
tarena_train.difference_update(["Java", "C#", "PHP"])
print(tarena_train)
結(jié)果為:
{'C#', 'Java', 'Android', 'Python', 'PHP'}
{'Android', 'Python'}
不可變集合
類似于列表和元祖的關(guān)系,Python里也提供了一種不可變集合(frozen set)虾啦。
不可變集合的創(chuàng)建方式和集合差不多麻诀,不過一旦創(chuàng)建,不可改變傲醉,一般作為字典中的key针饥。
# 不可變集合只有frozenset這一種創(chuàng)建方式
android_class = frozenset(["Java", "Android"])
c_class = frozenset(["C", "C++"])
dict_grade = dict([(android_class, "Excellent")])
dict_grade[c_class] = "Normal"
print(dict_grade)
結(jié)果為:
{frozenset({'Android', 'Java'}): 'Excellent', frozenset({'C', 'C++'}): 'Normal'}