10.Python基礎(chǔ)語法---06集合

集合

基本定義:通過{}構(gòu)建

特性:無序,不可重復(fù),元素可以是不同類型(不支持unhashable 類型的元素)

基礎(chǔ)操作

  1. 集合運(yùn)算
    1.1 |并集運(yùn)算符:求兩個集合并或合集
    1.2 &交集運(yùn)算符:求兩個集合交集
    1.3 -差集運(yùn)算符:求兩個集合差集

    s1 = {1, 2, 3, 4, 5, 6}
    s2 = {4, 5, 6, 7, 8, 9}
    print("s1: {}".format(s1))
    print("s2: {}".format(s2))
    # 并集
    s = s1 | s2
    print("s1|s2: {}".format(s))
    # 交集
    s = s1 & s2
    print("s1 & s2: {}".format(s))
    # 差集
    s = s1 - s2
    print("s1 - s2: {}".format(s))
    # 差集
    s = s2 - s1
    print("s2 - s1: {}".format(s))
    
    執(zhí)行結(jié)果:
    s1: {1, 2, 3, 4, 5, 6}
    s2: {4, 5, 6, 7, 8, 9}
    s1|s2: {1, 2, 3, 4, 5, 6, 7, 8, 9}
    s1 & s2: {4, 5, 6}
    s1 - s2: {1, 2, 3}
    s2 - s1: {8, 9, 7}
    
    
  2. 集合操作
    集合只存在添加和刪除兩個操作,無所謂修改操作
    2.1 添加
    set.add(x)——將x添加到集合中
    2.2 刪除
    set.remove(x)——從集合中移除元素 x。 如果 x 不存在于集合中則會引發(fā) KeyError致扯。
    set.discard(x)——如果元素 x 存在于集合中則將其移除训挡。
    set.pop()——從集合中移除并返回任意一個元素尚镰。 如果集合為空則會引發(fā) KeyError。任意代表隨機(jī)嗎立倍?灭红!
    set.clear()——清空集合

    # 添加
    s = {1,2,3,4,5}
    print("s:{}".format(s))
    s.add(6)
    print("s:{}".format(s))
    s.add(3)
    print("s:{}".format(s))
    
    print("*" * 23)
    
    # 刪除
    # remove()
    s.remove(4)
    print("s:{}".format(s))
    
    # s.remove(4)
    # Traceback (most recent call last):
    #   File "XXXXXXX", line XXX, in     <module>
    #     s.remove(4)
    # KeyError: 4
    
    # discard()
    returntest = s.discard(5)
    print("returntest:{}".format(returntest))
    print("s:{}".format(s))
    s.discard(5) # 不拋異常
    
    # pop()
    s.pop()
    print("s:{}".format(s))
    s.pop()
    print("s:{}".format(s))
    s.pop()
    print("s:{}".format(s))
    s.pop()
    print("s:{}".format(s))
    # s.pop()
    # print("s:{}".format(s))
    # Traceback (most recent call last):
    #   File "d:/Dev/WorkSpace/01SunnyLearn/Python/Basic/SunnyPython/basic/02group.py", line 620, in <module>
    #     s.pop()
    # KeyError: 'pop from an empty set'
    
    # All Test
    hello = "Hello Python World! We Are Family"
    for char in hello:
        s.add(char)
    
    print("s:{}".format(s))
    spop = s.pop()
    print("spop:{}".format(spop))
    print("s:{}".format(s))
    spop = s.pop()
    print("spop:{}".format(spop))
    print("s:{}".format(s))
    spop = s.pop()
    print("spop:{}".format(spop))
    print("s:{}".format(s))
    
    s.clear()
    print("s:{}".format(s))
    
    執(zhí)行結(jié)果:
    s:{1, 2, 3, 4, 5}
    s:{1, 2, 3, 4, 5, 6}
    s:{1, 2, 3, 4, 5, 6}
    ***********************
    s:{1, 2, 3, 5, 6}
    returntest:None
    s:{1, 2, 3, 6}
    s:{2, 3, 6}
    s:{3, 6}
    s:{6}
    s:set()
    s:{'r', 'A', 'd', 'n', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    spop:A
    s:{'r', 'd', 'n', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    spop:d
    s:{'r', 'n', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    spop:n
    s:{'r', 'H', 't', 'm', ' ', 'h', 'P', 'l', 'e', 'W', 'F', 'a', 'y', '!', 'i', 'o'}
    s:set()
    
  3. 其他操作
    3.1 len() 集合大小
    3.2 in, not in 成員判斷符

    s = "Hello Python World! We are Family!"
    print("s:{}".format(s))
    print("s字符串列表長度:{}".format(len(s)))
    
    t = set()
    for char in s:
       t.add(char)
    print("t:{}".format(t))
    print("t大小:{}".format(len(t)))
    
    print("{}".format("H" in t))
    print("{}".format("H" not in t))
    print("{}".format("U" in t ))
    print("{}".format("U" not in  t ))
    
    執(zhí)行結(jié)果:
    s:Hello Python World! We are Family!
    s字符串列表長度:34
    t:{'r', 'm', 'i', 'H', 'y', 'W', '!', 'F', ' ', 'd', 'a', 'o', 'l', 'P', 'h', 'e', 'n', 't'}
    t大小:18
    True
    False
    False
    True
    

補(bǔ)充

  • 如何定義空集合
    {}其實是定義了一個空字典口注;定義空集合需要使用set()
  • 集合無序性
    作為一種無序的多項集变擒,集合并不記錄元素位置或插入順序。 相應(yīng)地寝志,集合不支持索引娇斑、切片或其他序列類的操作

QA

Q1:為什么集合不支持unhashable 類型的元素
A:
簡單的可以理解為可哈希其實就是不可變,只有哈希不可變才能比較確認(rèn)是否重復(fù)材部,才能實現(xiàn)集合的無重復(fù)特性哦:晾隆!乐导!集合在內(nèi)部需要使用哈希值來判斷是否相等?喽 !物臂!

  • hashable -- 可哈希
    一個對象的哈希值如果在其生命周期內(nèi)絕不改變旺拉,就被稱為 可哈希 (它需要具有 __hash__() 方法),并可以同其他對象進(jìn)行比較(它需要具有 __eq__() 方法)棵磷《旯罚可哈希對象必須具有相同的哈希值,比較結(jié)果才會相同仪媒。沉桌,

    可哈希性使得對象能夠作為字典鍵或集合成員使用,因為這些數(shù)據(jù)結(jié)構(gòu)要在內(nèi)部使用哈希值。

    大多數(shù) Python 中的不可變內(nèi)置對象都是可哈希的蒲牧;可變?nèi)萜鳎ɡ缌斜砘蜃值洌┒疾豢晒F埠兀徊豢勺內(nèi)萜鳎ɡ缭M和 frozenset)僅當(dāng)它們的元素均為可哈希時才是可哈希的。 用戶定義類的實例對象默認(rèn)是可哈希的冰抢。 它們在比較時一定不相同(除非是與自己比較)松嘶,它們的哈希值的生成是基于它們的 id()

    內(nèi)置類型分類
    hashable:int, float, decimal, complex, bool, str, tuple,
    unhashable: list, dict, set
    驗證方法:

    >>> type(str.__hash__)
    <class 'wrapper_descriptor'>
    >>> type(int.__hash__)
    <class 'wrapper_descriptor'>
    >>> type(float.__hash__)
    <class 'wrapper_descriptor'>
    >>> import decimal
    >>> type(decimal.__hash__)
    <class 'method-wrapper'>
    >>> type(complex.__hash__)
    <class 'wrapper_descriptor'>
    >>> type(bool.__hash__)
    <class 'wrapper_descriptor'>
    >>> type(tuple.__hash__)
    <class 'wrapper_descriptor'>
    
    >>> type(list.__hash__)
    <class 'NoneType'>
    >>> type(dict.__hash__)
    <class 'NoneType'>
    >>> type(set.__hash__)
    <class 'NoneType'>
    
  • hash方法

>>> hash(0)
0
>>> hash(23)
23
>>> hash(-23)
-23
>>> hash(23.24)
553402322211282967
>>> hash(-23.24)
-553402322211282967
>>> hash('23')
-4826980359952576689
>>> hash(23+24j)
24000095
>>> hash(23-24j)
-24000049
>>> hash(True)
1
>>> hash(False)
0
>>> hash(None)
124074573
>>> hash([1,2,3,4,5])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash({'key1':1, 'key2':2})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'dict'
>>> hash((1,2,3,4,5))
8315274433719620810
>>> hash((1,2,3,[4,5]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash((1,2,3,(4,5)))
-325972594757234431
>>> hash({1,2,3})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

Q2:set.pop()所謂任意的機(jī)制與原理
A: //TODO
https://stackoverflow.com/questions/21017188/set-pop-isnt-random

參考:
互聯(lián)網(wǎng)相關(guān)資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挎扰,一起剝皮案震驚了整個濱河市翠订,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遵倦,老刑警劉巖尽超,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異梧躺,居然都是意外死亡似谁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門掠哥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巩踏,“玉大人,你說我怎么就攤上這事续搀∪恚” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵禁舷,是天一觀的道長彪杉。 經(jīng)常有香客問我,道長牵咙,這世上最難降的妖魔是什么派近? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮霜大,結(jié)果婚禮上构哺,老公的妹妹穿的比我還像新娘。我一直安慰自己战坤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布残拐。 她就那樣靜靜地躺著途茫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溪食。 梳的紋絲不亂的頭發(fā)上囊卜,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼栅组。 笑死雀瓢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玉掸。 我是一名探鬼主播刃麸,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼司浪!你這毒婦竟也來了泊业?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤啊易,失蹤者是張志新(化名)和其女友劉穎吁伺,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體租谈,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篮奄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了割去。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窟却。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖劫拗,靈堂內(nèi)的尸體忽然破棺而出间校,到底是詐尸還是另有隱情,我是刑警寧澤页慷,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布憔足,位于F島的核電站,受9級特大地震影響酒繁,放射性物質(zhì)發(fā)生泄漏滓彰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一州袒、第九天 我趴在偏房一處隱蔽的房頂上張望揭绑。 院中可真熱鬧,春花似錦郎哭、人聲如沸他匪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邦蜜。三九已至,卻和暖如春亥至,著一層夾襖步出監(jiān)牢的瞬間悼沈,已是汗流浹背贱迟。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留絮供,地道東北人衣吠。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像壤靶,于是被迫代替她去往敵國和親缚俏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容