- python的set和其他語言類似,?是一個無序不重復元素集,?基本功能包括關系測試和消除重復元素.?集合對象還支持union(聯合),?intersection(交),?difference(差)和sysmmetric?difference(對稱差集)等數學運算.??
- ??
- sets?支持?x?in?set,?len(set),和?for?x?in?set。作為一個無序的集合,sets不記錄元素位置或者插入點。因此,sets不支持?indexing,?slicing,?或其它類序列(sequence-like)的操作。??
- ??
- ???
- ??
- 下面來點簡單的小例子說明把。??
- ??
- >>>?x?=?set('spam')??
- >>>?y?=?set(['h','a','m'])??
- >>>?x,?y??
- (set(['a',?'p',?'s',?'m']),?set(['a',?'h',?'m']))??
- ??
- 再來些小應用。??
- ??
- >>>?x?&?y?#?交集??
- set(['a',?'m'])??
- ??
- >>>?x?|?y?#?并集??
- set(['a',?'p',?'s',?'h',?'m'])??
- ??
- >>>?x?-?y?#?差集??
- set(['p',?'s'])??
- ??
- 記得以前個網友提問怎么去除海量列表里重復元素,用hash來解決也行,只不過感覺在性能上不是很高,用set解決還是很不錯的,示例如下:??
- ??
- >>>?a?=?[11,22,33,44,11,22]??
- >>>?b?=?set(a)??
- >>>?b??
- set([33,?11,?44,?22])??
- >>>?c?=?[i?for?i?in?b]??
- >>>?c??
- [33,?11,?44,?22]??
- ??
- 很酷把,幾行就可以搞定。??
- ??
- 1.8 集合???
- ???
- 集合用于包含一組無序的對象。要創建集合,可使用set()函數并像下面這樣提供一系列的項:??
- ??
- ???
- ??
- s?=?set([3,5,9,10])??????#創建一個數值集合??
- ??
- t?=?set("Hello")?????????#創建一個唯一字符的集合??
- ??
- ???
- ??
- 與列表和元組不同,集合是無序的,也無法通過數字進行索引。此外,集合中的元素不能重復。例如,如果檢查前面代碼中t集合的值,結果會是:??
- ??
- ???
- ??
- >>>?t??
- ??
- set(['H',?'e',?'l',?'o'])??
- ??
- ???
- ??
- 注意只出現了一個'l'。??
- ??
- 集合支持一系列標準操作,包括并集、交集、差集和對稱差集,例如:??
- ??
- ???
- ??
- a?=?t?|?s??????????#?t?和?s的并集??
- ??
- b?=?t?&?s??????????#?t?和?s的交集??
- ??
- c?=?t?–?s??????????#?求差集(項在t中,但不在s中)??
- ??
- d?=?t?^?s??????????#?對稱差集(項在t或s中,但不會同時出現在二者中)??
- ??
- ???
- ??
- 基本操作:??
- ??
- t.add('x')????????????#?添加一項??
- ??
- s.update([10,37,42])??#?在s中添加多項??
- ??
- ???
- ??
- 使用remove()可以刪除一項:??
- ??
- t.remove('H')??
- ??
- ???
- ??
- len(s)??
- set?的長度??
- ??
- x?in?s??
- 測試?x?是否是?s?的成員??
- ??
- x?not?in?s??
- 測試?x?是否不是?s?的成員??
- ??
- s.issubset(t)??
- s?<=?t??
- 測試是否?s?中的每一個元素都在?t?中??
- ??
- s.issuperset(t)??
- s?>=?t??
- 測試是否?t?中的每一個元素都在?s?中??
- ??
- s.union(t)??
- s?|?t??
- 返回一個新的?set?包含?s?和?t?中的每一個元素??
- ??
- s.intersection(t)??
- s?&?t??
- 返回一個新的?set?包含?s?和?t?中的公共元素??
- ??
- s.difference(t)??
- s?-?t??
- 返回一個新的?set?包含?s?中有但是?t?中沒有的元素??
- ??
- s.symmetric_difference(t)??
- s?^?t??
- 返回一個新的?set?包含?s?和?t?中不重復的元素??
- ??
- s.copy()??
- 返回?set?“s”的一個淺復制??
- ??
- ??
- 請注意:union(),?intersection(),?difference()?和?symmetric_difference()?的非運算符(non-operator,就是形如?s.union()這樣的)版本將會接受任何?iterable?作為參數。相反,它們的運算符版本(operator?based?counterparts)要求參數必須是?sets。這樣可以避免潛在的錯誤,如:為了更可讀而使用?set('abc')?&?'cbs'?來替代?set('abc').intersection('cbs')。從?2.3.1?版本中做的更改:以前所有參數都必須是?sets。??
- ??
- 另外,Set?和?ImmutableSet?兩者都支持?set?與?set?之間的比較。兩個?sets?在也只有在這種情況下是相等的:每一個?set?中的元素都是另一個中的元素(二者互為subset)。一個?set?比另一個?set?小,只有在第一個?set?是第二個?set?的?subset?時(是一個?subset,但是并不相等)。一個?set?比另一個?set?打,只有在第一個?set?是第二個?set?的?superset?時(是一個?superset,但是并不相等)。??
- ??
- 子?set?和相等比較并不產生完整的排序功能。例如:任意兩個?sets?都不相等也不互為子?set,因此以下的運算都會返回?False:a<b,?a==b,?或者a>b。因此,sets?不提供?__cmp__?方法。??
- ??
- 因為?sets?只定義了部分排序功能(subset?關系),list.sort()?方法的輸出對于?sets?的列表沒有定義。??
- ??
- ??
- 運算符??
- ???運算結果??
- ??
- hash(s)??
- ???返回?s?的?hash?值??
- ??
- ??
- 下面這個表列出了對于?Set?可用二對于?ImmutableSet?不可用的運算:??
- ??
- 運算符(voperator)??
- 等價于??
- 運算結果??
- ??
- s.update(t)??
- s?|=?t??
- 返回增加了?set?“t”中元素后的?set?“s”??
- ??
- s.intersection_update(t)??
- s?&=?t??
- 返回只保留含有?set?“t”中元素的?set?“s”??
- ??
- s.difference_update(t)??
- s?-=?t??
- 返回刪除了?set?“t”中含有的元素后的?set?“s”??
- ??
- s.symmetric_difference_update(t)??
- s?^=?t??
- 返回含有?set?“t”或者?set?“s”中有而不是兩者都有的元素的?set?“s”??
- ??
- s.add(x)??
- ??
- 向?set?“s”中增加元素?x??
- ??
- s.remove(x)??
- ??
- 從?set?“s”中刪除元素?x,?如果不存在則引發?KeyError??
- ??
- s.discard(x)??
- ??
- 如果在?set?“s”中存在元素?x,?則刪除??
- ??
- s.pop()??
- ??
- 刪除并且返回?set?“s”中的一個不確定的元素,?如果為空則引發?KeyError??
- ??
- s.clear()??
- ??
- 刪除?set?“s”中的所有元素??
- ??
- ??
- 請注意:非運算符版本的?update(),?intersection_update(),?difference_update()和symmetric_difference_update()將會接受任意?iterable?作為參數。從?2.3.1?版本做的更改:以前所有參數都必須是?sets。??
- ??
- 還請注意:這個模塊還包含一個?union_update()?方法,它是?update()?方法的一個別名。包含這個方法是為了向后兼容。程序員們應該多使用?update()?方法,因為這個方法也被內置的?set()?和?frozenset()?類型支持。
轉載于:https://www.cnblogs.com/nkwy2012/p/6387179.html