Python數據結構之四——set(集合)

  Python版本:3.6.2  操做系統:Windows  做者:SmallWZQhtml

  通過幾天的回顧和學習,我終於把Python 3.x中的基礎知識介紹好啦。下面將要繼續什麼呢?讓我想一想先~~~嗯,仍是先整理一下近期有關Python基礎知識的隨筆吧。python

  Python編程軟件的安裝與使用——Windows、Linux和Mac編程

  Python基礎——輸出[print()]與輸入[input()]數據結構

  Python基礎——數據類型與基本運算【主要爲除法】ide

       Python基礎——字符串函數

       Python基礎——條件判斷post

       Python基礎——for/while循環學習

  上述六篇均爲Python 3.x的基礎知識。九尺高臺,起於累土。學習Python就要從最基本開始,通過逐步的積累,纔能有所成就。ui

  Python基礎知識再次回顧好了,接下來該幹嗎呢?這不繼續Python數據結構了嗎?this

  上次我寫了有關Python數據結構(列表、元組、字典)的3篇隨筆:

  Python數據結構之一——list(列表)

  Python數據結構之二——tuple(元組)

  Python數據結構之三——dict(字典)

  本篇隨筆將開始一段關於set(集合)之旅吧。

  什麼是集合呢?

  說到集合,我首先想到了高中的數學。高中,人生學習中最繁忙的一段時光。直到如今,我能回憶起最多的就是學習、學習、仍是讀書……言歸正傳,高一時的數學,咱們就接觸到了集合。書中應該是這樣定義的:

  集合:由一個或多個肯定的元素所構成的總體。若x是集合A元素,則記做xA

  集合中的元素有三個特徵:

  1. 肯定性:集合中的元素必須是肯定的;

  2. 互異性:集合中的元素互不相同,例如:集合A={1,a},則a不能等於1);

  3. 無序性:集合中的元素沒有前後之分,例如:集合{3,4,5}和{3,5,4}算做同一個集合。

  Python 3.x中的set特徵與數學中相似。咱們以前學過list、tuple以及dict。其實,set與dict大體相同,但set沒有Value,只有key。所以,set只是一組key的集合。因爲key不能重複,因此,在set中,沒有重複的key。

建立集合

 1.1 建立空集合

  在集合中,建立空集合(set)必須使用函數set()。

1 #建立空集合
2 >>>a = set()
3 >>>a
4 set()
5 >>>type(a)
6 <class 'set'>

  注:不能使用{},{}用於建立空字典。

1.2 建立非空集合

  非空集合能夠用大括號{}或 set() 函數來建立。

 1 #建立集合
 2 >>>a={'a','b','c','d'}
 3 >>>b=set('abcdefabcd')
 4 >>>c=set({'a':1,'b':2,'c':3})
 5 >>>d=set(['a','b','c','a'])
 6 #運行結果
 7 >>>print(a,type(a))
 8 {'c', 'd', 'b', 'a'} <class 'set'>
 9 >>>print(b,type(b))
10 {'f', 'e', 'b', 'c', 'd', 'a'} <class 'set'>
11 >>>print(c,type(c))
12 {'b', 'a','c'} <class 'set'>
13 >>>print(d,type(d))
14 {'c', 'b', 'a'} <class 'set'>

  特別地,set中的元素是無序的,而且重複元素在set中自動被過濾。

1 #set中重複元素被自動過濾
2 >>>s = {1,2,,1,2,4,4,3,3}
3 >>>s
4 {1,2,3,4}

 

功能屬性

  set有不少不少的功能屬性。大家不信?不信的話,繼續往下看唄~~~

  set功能屬性以下:

1 class set(object):
  2     """
  3     set() -> new empty set object
  4     set(iterable) -> new set object
  5     
  6     Build an unordered collection of unique elements.
  7     """
  8     def add(self, *args, **kwargs): # real signature unknown
  9         """
 10         Add an element to a set.
 11         
 12         This has no effect if the element is already present.
 13         """
 14         pass
 15 
 16     def clear(self, *args, **kwargs): # real signature unknown
 17         """ Remove all elements from this set. """
 18         pass
 19 
 20     def copy(self, *args, **kwargs): # real signature unknown
 21         """ Return a shallow copy of a set. """
 22         pass
 23 
 24     def difference(self, *args, **kwargs): # real signature unknown
 25         """
 26         Return the difference of two or more sets as a new set.
 27         
 28         (i.e. all elements that are in this set but not the others.)
 29         """
 30         pass
 31 
 32     def difference_update(self, *args, **kwargs): # real signature unknown
 33         """ Remove all elements of another set from this set. """
 34         pass
 35 
 36     def discard(self, *args, **kwargs): # real signature unknown
 37         """
 38         Remove an element from a set if it is a member.
 39         
 40         If the element is not a member, do nothing.
 41         """
 42         pass
 43 
 44     def intersection(self, *args, **kwargs): # real signature unknown
 45         """
 46         Return the intersection of two sets as a new set.
 47         
 48         (i.e. all elements that are in both sets.)
 49         """
 50         pass
 51 
 52     def intersection_update(self, *args, **kwargs): # real signature unknown
 53         """ Update a set with the intersection of itself and another. """
 54         pass
 55 
 56     def isdisjoint(self, *args, **kwargs): # real signature unknown
 57         """ Return True if two sets have a null intersection. """
 58         pass
 59 
 60     def issubset(self, *args, **kwargs): # real signature unknown
 61         """ Report whether another set contains this set. """
 62         pass
 63 
 64     def issuperset(self, *args, **kwargs): # real signature unknown
 65         """ Report whether this set contains another set. """
 66         pass
 67 
 68     def pop(self, *args, **kwargs): # real signature unknown
 69         """
 70         Remove and return an arbitrary set element.
 71         Raises KeyError if the set is empty.
 72         """
 73         pass
 74 
 75     def remove(self, *args, **kwargs): # real signature unknown
 76         """
 77         Remove an element from a set; it must be a member.
 78         
 79         If the element is not a member, raise a KeyError.
 80         """
 81         pass
 82 
 83     def symmetric_difference(self, *args, **kwargs): # real signature unknown
 84         """
 85         Return the symmetric difference of two sets as a new set.
 86         
 87         (i.e. all elements that are in exactly one of the sets.)
 88         """
 89         pass
 90 
 91     def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
 92         """ Update a set with the symmetric difference of itself and another. """
 93         pass
 94 
 95     def union(self, *args, **kwargs): # real signature unknown
 96         """
 97         Return the union of sets as a new set.
 98         
 99         (i.e. all elements that are in either set.)
100         """
101         pass
102 
103     def update(self, *args, **kwargs): # real signature unknown
104         """ Update a set with the union of itself and others. """
105         pass
106 
107     def __and__(self, *args, **kwargs): # real signature unknown
108         """ Return self&value. """
109         pass
110 
111     def __contains__(self, y): # real signature unknown; restored from __doc__
112         """ x.__contains__(y) <==> y in x. """
113         pass
114 
115     def __eq__(self, *args, **kwargs): # real signature unknown
116         """ Return self==value. """
117         pass
118 
119     def __getattribute__(self, *args, **kwargs): # real signature unknown
120         """ Return getattr(self, name). """
121         pass
122 
123     def __ge__(self, *args, **kwargs): # real signature unknown
124         """ Return self>=value. """
125         pass
126 
127     def __gt__(self, *args, **kwargs): # real signature unknown
128         """ Return self>value. """
129         pass
130 
131     def __iand__(self, *args, **kwargs): # real signature unknown
132         """ Return self&=value. """
133         pass
134 
135     def __init__(self, seq=()): # known special case of set.__init__
136         """
137         set() -> new empty set object
138         set(iterable) -> new set object
139         
140         Build an unordered collection of unique elements.
141         # (copied from class doc)
142         """
143         pass
144 
145     def __ior__(self, *args, **kwargs): # real signature unknown
146         """ Return self|=value. """
147         pass
148 
149     def __isub__(self, *args, **kwargs): # real signature unknown
150         """ Return self-=value. """
151         pass
152 
153     def __iter__(self, *args, **kwargs): # real signature unknown
154         """ Implement iter(self). """
155         pass
156 
157     def __ixor__(self, *args, **kwargs): # real signature unknown
158         """ Return self^=value. """
159         pass
160 
161     def __len__(self, *args, **kwargs): # real signature unknown
162         """ Return len(self). """
163         pass
164 
165     def __le__(self, *args, **kwargs): # real signature unknown
166         """ Return self<=value. """
167         pass
168 
169     def __lt__(self, *args, **kwargs): # real signature unknown
170         """ Return self<value. """
171         pass
172 
173     @staticmethod # known case of __new__
174     def __new__(*args, **kwargs): # real signature unknown
175         """ Create and return a new object.  See help(type) for accurate signature. """
176         pass
177 
178     def __ne__(self, *args, **kwargs): # real signature unknown
179         """ Return self!=value. """
180         pass
181 
182     def __or__(self, *args, **kwargs): # real signature unknown
183         """ Return self|value. """
184         pass
185 
186     def __rand__(self, *args, **kwargs): # real signature unknown
187         """ Return value&self. """
188         pass
189 
190     def __reduce__(self, *args, **kwargs): # real signature unknown
191         """ Return state information for pickling. """
192         pass
193 
194     def __repr__(self, *args, **kwargs): # real signature unknown
195         """ Return repr(self). """
196         pass
197 
198     def __ror__(self, *args, **kwargs): # real signature unknown
199         """ Return value|self. """
200         pass
201 
202     def __rsub__(self, *args, **kwargs): # real signature unknown
203         """ Return value-self. """
204         pass
205 
206     def __rxor__(self, *args, **kwargs): # real signature unknown
207         """ Return value^self. """
208         pass
209 
210     def __sizeof__(self): # real signature unknown; restored from __doc__
211         """ S.__sizeof__() -> size of S in memory, in bytes """
212         pass
213 
214     def __sub__(self, *args, **kwargs): # real signature unknown
215         """ Return self-value. """
216         pass
217 
218     def __xor__(self, *args, **kwargs): # real signature unknown
219         """ Return self^value. """
220         pass
221 
222     __hash__ = None
set

   set功能屬性雖多,但平時經常使用的也就那麼幾個。

經常使用屬性

  1. 添加元素

  在集合中添加元素,可使用add()方法,而且不生成一個新的集合。

 1 #添加元素:add()
 2 >>>s = {1,2,3}
 3 >>>s.add(4)
 4 >>>s
 5 {1,2,3,4}
 6 >>>s.add('g')
 7 >>>s
 8 {1,2,3,4,'g'}
 9 >>>s.add(4)
10 >>>s
11 {1,2,3,4,'g'}

  add()方法能夠向set中添加元素,能夠重複添加,但不會有效果。

  2. 刪除元素

   set中利用remove()方法能夠刪除集合中的元素。

1 #刪除元素
2 >>>s
3 {1,2,3,4,'g'}
4 >>>s.remove('g')
5 >>>s
6 {1,2,3,4}

  3. 清空元素

  clear()方法能夠清空set中的元素。

1 #清空元素
2 >>>a = {1,2,3,4}
3 >>>b = a.clear()
4 >>>print(a,type(a))
5 set() <class 'set'>
6 >>>print(b,type(b))
7 None <class 'NoneType'>

  4. 複製元素

  copy()方法只能淺拷貝set中的元素,並生成一個新的集合。

 1 #淺拷貝:copy()
 2 >>>a = {1,(9,2),3}
 3 >>>b = a.copy()
 4 >>>print(a,id(a))
 5 {(9, 2), 1, 3} 2097937619880
 6 >>>print(b,id(b))
 7 {(9, 2), 1, 3} 2097937620776
 8 
 9 #賦值
10 >>>s = {1,2,3,4}
11 >>>d = s
12 >>>print(s,id(s))
13 {1, 2, 3, 4} 2097937785128
14 >>>print(d,id(d))
15 {1, 2, 3, 4} 2097937785128

  5. pop()

  pop()方法用於從set中隨機取一個元素。記住,是隨機的~~~

1 #pop()方法
2 >>>s = {1,2,3,4,5,'g','s'}
3 >>>s.pop()
4 'g'
5 >>>s.pop()
6 3

  6. set集合操做

  set與數學中的集合相似,是無序的和無重複元素的集合。所以,在Python中,set能夠進行交集、並集、補集等操做。

Python set集合操做
數學符號 Python符號 含義
- 或\ - 差集,相對補集
& 交集
| 並集
!= 不等於
== 等於
in 是成員關係
not in 非成員關係

 

 1 #set集合操做
 2 >>>s = {1,2,3,4}
 3 >>>d = {2.3.5.6}
 4 >>>s & d
 5 {2.3}
 6 >>>s | d
 7 {1,2,3,4,5,6}
 8 >>>s - d
 9 {1,4}
10 >>>d - s
11 {5,6}

  set和dict的惟一區別僅在於沒有存儲對應的value,可是,set的原理和dict同樣,因此,一樣不能夠放入可變對象,由於沒法判斷兩個可變對象是否相等,也就沒法保證set內部「不會有重複元素」。所以,最經常使用的key是字符串。

「思想者」

  set中存儲着key,集合中不能放入可變的對象。以前的文章也說過:tuple是不可變的,而list是可變的。所以,set中是能夠存儲tuple的。這是真的嗎?

  時間是檢驗真理的惟一標準。下面請看示例代碼:

 1 #tuple能夠做爲集合中的元素
 2 >>>s = {(1,),(1,2,3),1,2,'g'}
 3 >>>s
 4 {(1,),(1,2,3),1,2,'g'}
 5 
 6 #tuple也有失靈的時候
 7 >>>t = (1,2,[1,2,3],4)
 8 >>>type(t)
 9 <class 'tuple'>
10 >>>d = {1,2,(1,2,[1,2,3],4)}
11 Traceback (most recent call last):
12   File "<stdin>", line 1, in <module>
13 TypeError: unhashable type: 'list'

  爲何會有錯誤呢?我也不清楚哎~~~這裏面的道道很深,請讀者細細體會。

  set是一種數據結構。若是要詳細的介紹set,我應該能夠去出書了。這篇隨筆只是起到入門的效果。

  正所謂「師傅」領進門,修行靠你們嘛!

相關文章
相關標籤/搜索