官术网_书友最值得收藏!

7.2 集合:在我的世界里,你就是唯一

視頻講解

Python的字典是對數(shù)學(xué)中映射概念支持的直接體現(xiàn),然而今天我們請來了字典的“表親”:集合。

難道它們長得很像?來,大家看下代碼:

     >>> num1 = {}
     >>> type(num1)
     <class 'dict'>
     >>> num2 = {1, 2, 3, 4, 5}
     >>> type(num2)
     <class 'set'>

在Python 3里,如果用大括號(hào)括起一堆數(shù)字但沒有體現(xiàn)出映射關(guān)系,那么Python就會(huì)認(rèn)為這堆數(shù)據(jù)是一個(gè)集合而不是映射。

集合在Python中的最大特點(diǎn)就是兩個(gè)字:唯一。

舉個(gè)例子:

     >>> num = {1, 2, 3, 4 ,5, 4, 3, 2, 1}
     >>> num
     {1, 2, 3, 4, 5}

大家看到,根本不需要額外做些什么,集合就會(huì)自動(dòng)地將重復(fù)的數(shù)據(jù)刪除,這樣是不是很方便呢?但要注意的是,集合是無序的,也就是不能試圖去索引集合中的某一個(gè)元素:

7.2.1 創(chuàng)建集合

創(chuàng)建集合有兩種方法:一種是直接把一堆元素用大括號(hào)({})括起來;另一種是用set()內(nèi)置函數(shù)。

     >>> set1 = {"小甲魚", "小魷魚", "小鯉魚", "小甲魚"}
     >>> set2 = set(["小甲魚", "小魷魚", "小鯉魚", "小甲魚"])
     >>> set1 == set2
     True

現(xiàn)在要求去除列表[1, 2, 3, 4, 5, 5, 3, 1, 0]中重復(fù)的元素,如果還沒有學(xué)習(xí)過集合,可能代碼要這么寫:

學(xué)習(xí)了集合之后,就可以這么寫:

     >>> list1 = [1, 2, 3, 4, 5, 5, 3, 1, 0]
     >>> list1 = list(set(list1))
     >>> list1
     [0, 1, 2, 3, 4, 5]

看,知識(shí)才是第一生產(chǎn)力!不過大家發(fā)現(xiàn)沒有,由于set()創(chuàng)造的集合內(nèi)部是無序的,所以再調(diào)用list()將無序的集合轉(zhuǎn)換成列表就不能保證原來的列表順序了(這里Python好心辦壞事兒,把0放到最前面了),所以如果關(guān)注列表中元素的排序問題,那么在使用set()函數(shù)時(shí)就要提高警惕。

7.2.2 訪問集合

由于集合中的元素是無序的,所以并不能像序列那樣用下標(biāo)來進(jìn)行訪問,但是可以使用迭代把集合中的數(shù)據(jù)一個(gè)個(gè)讀取出來:

當(dāng)然也可以使用in和not in判斷一個(gè)元素是否在集合中已經(jīng)存在:

     >>> 0 in set1
     True
     >>> 'oo' in set1
     False
     >>> 'xx' not in set1
     True

使用add()方法可以為集合添加元素,使用remove()方法可以刪除集合中已知的元素:

     >>> set1.add(6)
     >>> set1
     {0, 1, 2, 3, 4, 5, 6}
     >>> set1.remove(5)
     >>> set1
     {0, 1, 2, 3, 4, 6}

7.2.3 不可變集合

有時(shí)候希望集合中的數(shù)據(jù)具有穩(wěn)定性,也就是說,像元組一樣,不能隨意地增加或刪除集合中的元素。那么可以定義成不可變集合,這里使用的是frozenset()函數(shù),就是把元素給frozen(冰凍)起來:

主站蜘蛛池模板: 上栗县| 福安市| 平阴县| 张掖市| 崇仁县| 无为县| 饶阳县| 平江县| 铅山县| 阿拉善盟| 麻城市| 连城县| 福贡县| 岳西县| 利川市| 富川| 梧州市| 青神县| 娄底市| 连平县| 肥乡县| 浮梁县| 化州市| 资溪县| 金阳县| 乌鲁木齐县| 祁门县| 莱西市| 呈贡县| 加查县| 华亭县| 贞丰县| 和林格尔县| 罗定市| 应城市| 嘉鱼县| 眉山市| 当阳市| 华亭县| 界首市| 南阳市|