天天看點

Python資料類型之集合一、可變集合(set)二、不可變集合frozenset

集合(set)與字典類似,也是由大括号{}表示,多個元素之間用逗号‘,’分隔。需要注意集合是無序且不重複的,集合中的元素必須是不可變資料(字元串,整數,元祖)。同數學中的集合一樣,集合可以執行集合的并、交、差運算。注:對于 并集, 交集, 差集 等的傳回值,與最左邊的操作數具有相同的類型。例如:s & t  取交集。s集合是一個set類型的集合,t集合是一個frozenset類型的集合,則傳回的結果将是set類型的集合。

集合有兩種不同的類型,可變集合(set)和不可變集合:①可變集合可以添加或删除元素,但可變集合所存儲的元素不能被哈希,是以不能用做字典的鍵;②不可變集合(frozenset)不能添加或删除元素,但元素是可哈希的,可以做字典的鍵

一、可變集合(set)

1、set的建立

# -*- coding:utf-8 -*-
# author: kenny

# 建立:用{}直接建立,也可以用工廠函數set()來建立
set_1 = {1, 2, 3, 4}
print(set_1)  # {1, 2, 3, 4}
set_2 = set()
print(set_2)  # set()

# 集合會把傳入的字元串拆分為單個字元作為集合的成員
set_3 = set("java")
print(set_3)  # {'a', 'j', 'v'}
# 當傳入清單時,集合會把清單内的元素作為集合成員。
set_4 = set(['python', 'c', 'c++'])
print(set_4)  # {'c', 'python', 'c++'}

# 空集合隻能使用set()函數來定義,直接使用{}定義的是空字典
s1 = set()
s2 = {}
print(type(s1))  # <class 'set'>
print(type(s2))  # <class 'dict'>
           

2、增加

(1)set1.add('元素')--->将元素無序的插入集合set1中

set_1 = {1, 2, 3, 4}
set_1.add('java')
print(set_1)  # {1, 2, 3, 4, 'java'}
           

(2)set1.update("元素")--->将元素疊代的無序的加入集合set1中

set_1 = {1, 2, 3, 4}
set_1.update("java")
print(set_1)  # {1, 2, 3, 4, 'j', 'a', 'v'}
           

3、删除

(1)set1.pop()---->随機删除,傳回值為删除掉的元素

set_1 = {1, 2, 3, 4}

s = set_1.pop()

print(set_1) # {2, 3, 4}

print(s) # 1
           

(2)set1.remove("元素")--->按元素删除,若無該元素則報錯

set_1 = {1, 2, 3, 4}

set_1.remove(2)

print(set_1) # {1, 3, 4}
           

 (3)set1.discard(obj)---->如果集合記憶體在指定元素,則删除,若不存在,不做任何事

set_1 = {1, 2, 3, 4}
set_1.discard(1)
print(set_1)  # {2, 3, 4}
           

(4)set1.clear()--->清空集合。輸出集合的時候是set(),為了與空字典{}相區分

set_1 = {1, 2, 3, 4}

set_1.clear()

print(set_1) # set()
           

(5)del set1------>删除整個集合

set_1 = {1, 2, 3, 4}

del set_1

print(set_1) # NameError: name 'set_1' is not defined
           

4、查找

        因為集合是無序的,是以取某一個值,隻能用for周遊

set_1 = {1, 2, 3, 4}
for i in set_1:
    print(i, end=' ')  # 1 2 3 4

print(set_1(1))  # TypeError: 'set' object is not callable
           

        我們雖然不能直接查找集合,但是我們可以用in操作符檢視集合中是否存在對象

set_1 = {1, 2, 'java'}
print('1' in set_1)  # False
print(1 in set_1)  # True
           

5、交集,并集,差集

s1 = {1, 'java', ('tuple_1', 'tuple_2', 3)}
s2 = {'do', 're', 'mi', 1, ('tuple_1', 'tuple_2', 3)}
s_jiao = s1 & s2
s_bing = s1 | s2
s_cha = s1 - s2

# 交集
print(s_jiao)  # {1, ('tuple_1', 'tuple_2', 3)}
print(s1.intersection(s2))  # {1, ('tuple_1', 'tuple_2', 3)}

# 并集
print(s_bing)  # {'re', 1, ('tuple_1', 'tuple_2', 3), 'java', 'mi', 'do'}
print(s1.union(s2))  # {'re', 1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 'java'}

# 差集
print(s_cha)  # {'java'}
print(s1.difference(s2))  # {'java'}

# 對稱差集:去掉交集後的元素
print(s1 ^ s2)  # {'re', 'do', 'mi', 'java'}
print(s1.symmetric_difference(s2))  # {'java', 'mi', 'do', 're'}

# s1與s2取交集,然後用結果更新s1
s1.intersection_update(s2)
print(s1)  # {1, ('tuple_1', 'tuple_2', 3)}
print(s2)  # {1, ('tuple_1', 'tuple_2', 3), 'do', 'mi', 're'}

# s1與s2取差集,然後用結果更新s1
s1.difference_update(s2)
print(s1)  # {'java'}
print(s2)  # {'do', 1, 'mi', ('tuple_1', 'tuple_2', 3), 're'}

# s1與s2取對稱差集,然後用結果更新s1
s1.symmetric_difference_update(s2)
print(s1)  # {'mi', 'java', 'do', 're'}
print(s2)  # {'mi', 1, 'do', 're', ('tuple_1', 'tuple_2', 3)}
           

二、不可變集合frozenset

        不可變集合不可以增加删除集合中的元素,該集合中的内容是不可改變的,類似于字元串、元組。

        不可變集合,除了内容不能更改外,其他功能及操作跟可變集合set一樣

# 不可變集合的建立
fset = frozenset((1,2,3,4,5))
print(fset)  # frozenset({1, 2, 3, 4, 5})