亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

跟老齊學Python之集合(set)

系統 1980 0

回顧一下已經了解的數據類型:int/str/bool/list/dict/tuple

還真的不少了.

不過,python是一個發展的語言,沒準以后還出別的呢.看官可能有疑問了,出了這么多的數據類型,我也記不住呀,特別是里面還有不少方法.

不要擔心記不住,你只要記住愛因斯坦說的就好了.

            
愛因斯坦在美國演講,有人問:“你可記得聲音的速度是多少?你如何記下許多東西?”
愛因斯坦輕松答道:“聲音的速度是多少,我必須查辭典才能回答。因為我從來不記在辭典上已經印著的東西,我的記憶力是用來記憶書本上沒有的東西?!?
          

多么霸氣的回答,這回答不僅僅霸氣,更是在告訴我們一種方法:只要能夠通過某種方法查找到的,就不需要記憶.

那么,上面那么多數據類型的各種方法,都不需要記憶了,因為它們都可以通過下述方法但不限于這些方法查到(這句話的邏輯還是比較嚴密的,包括但不限于...)

交互模式下用dir()或者help()
google(不推薦Xdu,原因自己體會啦)

為了能夠在總體上對已經學習過的數據類型有了解,我們不妨做如下分類:

1.是否為序列類型:即該數據的元素是否能夠索引.其中序列類型的包括str/list/tuple
2.是否可以原處修改:即該數據的元素是否能夠原處修改(特別提醒看官,這里說的是原處修改問題,有的資料里面說str不能修改,也是指原處修改問題.為了避免誤解,特別強調了原處).能夠原處修改的是list/dict(特別說明,dict的鍵必須是不可修改的,dict的值可原處修改)
什么原處修改?看官能不能在交互模式下通過實例解釋一下?

到這里,看官可千萬不要以為本講是復習課.本講的主要內容不是復習,主要內容是要向看官介紹一種新的數據類型:集合(set).徹底暈倒了,到底python有多少個數據類型呢?又多出來了一個.

從基本道理上說,python中的數據類型可以很多,因為每個人都可以自己定義一種數據類型.但是,python官方認可或者說內置的數據類型,就那么幾種了.基本上今天的set講完,就差不多了.在以后的開發過程中,包括今天和以往介紹的數據類型,是常用的.當然,自己定義一個也可以,但是用原生的更好.

創建set

tuple算是list和str的雜合(雜交的都有自己的優勢,上一節的末后已經顯示了),那么set則可以堪稱是list和dict的雜合.

set擁有類似dict的特點:可以用{}花括號來定義;其中的元素沒有序列,也就是是非序列類型的數據;而且,set中的元素不可重復,這就類似dict的鍵.

set也有繼承了一點list的特點:如可以原處修改(事實上是一種類別的set可以原處修改,另外一種不可以).

下面通過實驗,進一步理解創建set的方法:

            
>>> s1 = set("qiwsir") #把str中的字符拆解開,形成set.特別注意觀察:qiwsir中有兩個i
>>> s1         #但是在s1中,只有一個i,也就是不能重復
set(['q', 'i', 's', 'r', 'w'])

>>> s2 = set([123,"google","face","book","facebook","book"])  #通過list創建set.不能有重復,元素可以是int/str
>>> s2
set(['facebook', 123, 'google', 'book', 'face'])        #元素順序排列不是按照指定順序

>>> s3 = {"facebook",123}    #通過{}直接創建
>>> s3
set([123, 'facebook'])


          

再大膽做幾個探究,請看官注意觀察結果:

            
>>> s3 = {"facebook",[1,2,'a'],{"name":"python","lang":"english"},123}
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
TypeError: unhashable type: 'dict'

>>> s3 = {"facebook",[1,2],123}
Traceback (most recent call last):
 File "
                
                  ", line 1, in 
                  
                    
TypeError: unhashable type: 'list'


                  
                
              
            
          

從上述實驗中,可以看出,通過{}無法創建含有list/dict元素的set.

繼續探索一個情況:

            
>>> s1
set(['q', 'i', 's', 'r', 'w'])
>>> s1[1] = "I"
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
TypeError: 'set' object does not support item assignment

>>> s1   
set(['q', 'i', 's', 'r', 'w'])
>>> lst = list(s1)
>>> lst
['q', 'i', 's', 'r', 'w']
>>> lst[1] = "I"
>>> lst
['q', 'I', 's', 'r', 'w']


              
            
          

上面的探索中,將set和list做了一個對比,雖然說兩者都能夠做原處修改,但是,通過索引編號(偏移量)的方式,直接修改,list允許,但是set報錯.

那么,set如何修改呢?

更改set

還是用前面已經介紹過多次的自學方法,把set的有關內置函數找出來,看看都可以對set做什么操作.

            
>>> dir(set)
['__and__', '__class__', '__cmp__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

          

為了看的清楚,我把雙劃線__開始的先刪除掉(后面我們會有專題講述這些):

'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update'

然后用help()可以找到每個函數的具體使用方法,下面列幾個例子:

增加元素

            
>>> help(set.add)

Help on method_descriptor:

add(...)
Add an element to a set. 
This has no effect if the element is already present.


          

下面在交互模式這個最好的實驗室里面做實驗:

            
>>> a_set = {}       #我想當然地認為這樣也可以建立一個set
>>> a_set.add("qiwsir")   #報錯.看看錯誤信息,居然告訴我dict沒有add.我分明建立的是set呀.
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
AttributeError: 'dict' object has no attribute 'add'
>>> type(a_set)       #type之后發現,計算機認為我建立的是一個dict   

                
                
              
            
          

特別說明一下,{}這個東西,在dict和set中都用.但是,如上面的方法建立的是dict,不是set.這是python規定的.要建立set,只能用前面介紹的方法了.

            
>>> a_set = {'a','i'}    #這回就是set了吧
>>> type(a_set)
 
            
                     #果然

>>> a_set.add("qiwsir")   #增加一個元素
>>> a_set          #原處修改,即原來的a_set引用對象已經改變
set(['i', 'a', 'qiwsir'])

>>> b_set = set("python")
>>> type(b_set)

              
                
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'y'])
>>> b_set.add("qiwsir")
>>> b_set
set(['h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.add([1,2,3])   #這樣做是不行滴,跟前面一樣,報錯.
Traceback (most recent call last):
 File "
                
                  ", line 1, in 
                  
                    
TypeError: unhashable type: 'list'

>>> b_set.add('[1,2,3]')  #可以這樣!
>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])


                  
                
              
            
          

除了上面的增加元素方法之外,還能夠從另外一個set中合并過來元素,方法是set.update(s2)

            
>>> help(set.update)
update(...)
  Update a set with the union of itself and others.

>>> s1
set(['a', 'b'])
>>> s2
set(['github', 'qiwsir'])
>>> s1.update(s2)    #把s2的元素并入到s1中.
>>> s1         #s1的引用對象修改
set(['a', 'qiwsir', 'b', 'github'])
>>> s2         #s2的未變
set(['github', 'qiwsir'])


          

刪除

            
>>> help(set.pop)
pop(...)
  Remove and return an arbitrary set element.
  Raises KeyError if the set is empty.

>>> b_set
set(['[1,2,3]', 'h', 'o', 'n', 'p', 't', 'qiwsir', 'y'])
>>> b_set.pop()   #從set中任意選一個刪除,并返回該值
'[1,2,3]'
>>> b_set.pop()
'h'
>>> b_set.pop()
'o'
>>> b_set
set(['n', 'p', 't', 'qiwsir', 'y'])

>>> b_set.pop("n") #如果要指定刪除某個元素,報錯了.
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
TypeError: pop() takes no arguments (1 given)


              
            
          

set.pop()是從set中任意選一個元素,刪除并將這個值返回.但是,不能指定刪除某個元素.報錯信息中就告訴我們了,pop()不能有參數.此外,如果set是空的了,也報錯.這條是幫助信息告訴我們的,看官可以試試.

要刪除指定的元素,怎么辦?

            
>>> help(set.remove)

remove(...)
  Remove an element from a set; it must be a member.  

  If the element is not a member, raise a KeyError.
set.remove(obj)中的obj,必須是set中的元素,否則就報錯.試一試:

>>> a_set
set(['i', 'a', 'qiwsir'])
>>> a_set.remove("i")
>>> a_set
set(['a', 'qiwsir'])
>>> a_set.remove("w")
Traceback (most recent call last):
 File "
            
              ", line 1, in 
              
                
KeyError: 'w'


              
            
          

跟remove(obj)類似的還有一個discard(obj):

>>> help(set.discard)

discard(...)
??? Remove an element from a set if it is a member.

??? If the element is not a member, do nothing.
與help(set.remove)的信息對比,看看有什么不同.discard(obj)中的obj如果是set中的元素,就刪除,如果不是,就什么也不做,do nothing.新聞就要對比著看才有意思呢.這里也一樣.

            
>>> a_set.discard('a')
>>> a_set    
set(['qiwsir'])
>>> a_set.discard('b')
>>>

          

在刪除上還有一個絕殺,就是set.clear(),它的功能是:Remove all elements from this set.(看官自己在交互模式下help(set.clear))

            
>>> a_set
set(['qiwsir'])
>>> a_set.clear()
>>> a_set
set([])
>>> bool(a_set)   #空了,bool一下返回False.
False

          

知識

集合,也是一個數學概念(以下定義來自維基百科)

集合(或簡稱集)是基本的數學概念,它是集合論的研究對象。最簡單的說法,即是在最原始的集合論─樸素集合論─中的定義,集合就是“一堆東西”。集合里的“東西”,叫作元素。若然 x 是集合 A 的元素,記作 x ∈ A。

集合是現代數學中一個重要的基本概念。集合論的基本理論直到十九世紀末才被創立,現在已經是數學教育中一個普遍存在的部分,在小學時就開始學習了。這里對被數學家們稱為“直觀的”或“樸素的”集合論進行一個簡短而基本的介紹;更詳細的分析可見樸素集合論。對集合進行嚴格的公理推導可見公理化集合論。

在計算機中,集合是什么呢?同樣來自維基百科,這么說的:

            
在計算機科學中,集合是一組可變數量的數據項(也可能是0個)的組合,這些數據項可能共享某些特征,需要以某種操作方式一起進行操作。一般來講,這些數據項的類型是相同的,或基類相同(若使用的語言支持繼承)。列表(或數組)通常不被認為是集合,因為其大小固定,但事實上它常常在實現中作為某些形式的集合使用。
集合的種類包括列表,集,多重集,樹和圖。枚舉類型可以是列表或集。

          

不管是否明白,貌似很厲害呀.

是的,所以本講僅僅是對集合有一個入門.關于集合的更多操作如運算/比較等,還沒有涉及呢.


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!?。?/p>

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 奇米影视亚洲 | 男女xxⅹ爽免费视频 | 亚洲综合亚洲综合网成人 | 2019亚洲日韩新视频 | 国产目拍亚洲精品一区麻豆 | 91成人精品 | 精品在线99 | 国产精品免费aⅴ片在线观看 | 狠狠色噜噜狠狠色综合久 | 日本一区二区精品 | 久久精品国产波多野结衣 | 久久99热精品免费观看无卡顿 | 一级毛片美国一级j毛片不卡 | 欧美精品成人 | 午夜视频久久久久一区 | 久久久噜久噜久久综合 | 91国在线高清视频 | 性新婚a大黄毛片 | 五月婷婷亚洲综合 | 天天干天天色综合网 | 国产成人久久综合二区 | 天天插狠狠干 | 四虎综合九九色九九综合色 | 涩涩色视频在线播放 | 在线观看中文字幕亚洲 | 亚洲男人的天堂在线视频 | 国产免费午夜a无码v视频 | 波多野结衣在线观看3人 | 日韩成a人片在线观看日本 日韩成人 | 日本一级片免费观看 | 国产看色免费 | 国产成人在线免费观看 | 91精东果冻蜜桃星空麻豆 | 青青青在线视频人视频在线 | 日韩欧国产精品一区综合无码 | 精品在线免费观看视频 | 久久在草 | 国产精品天天操 | 99美国热| 久久精品国产99国产精品免费看 | aaa一级特黄 |