1 2 :mod:`sets` --- Unordered collections of unique elements 3 ======================================================== 4 5 .. module:: sets 6 :synopsis: Implementation of sets of unique elements. 7 :deprecated: 8 .. moduleauthor:: Greg V. Wilson <gvwilson (a] nevex.com> 9 .. moduleauthor:: Alex Martelli <aleax (a] aleax.it> 10 .. moduleauthor:: Guido van Rossum <guido (a] python.org> 11 .. sectionauthor:: Raymond D. Hettinger <python (a] rcn.com> 12 13 14 .. versionadded:: 2.3 15 16 .. deprecated:: 2.6 17 The built-in :class:`set`/:class:`frozenset` types replace this module. 18 19 The :mod:`sets` module provides classes for constructing and manipulating 20 unordered collections of unique elements. Common uses include membership 21 testing, removing duplicates from a sequence, and computing standard math 22 operations on sets such as intersection, union, difference, and symmetric 23 difference. 24 25 Like other collections, sets support ``x in set``, ``len(set)``, and ``for x in 26 set``. Being an unordered collection, sets do not record element position or 27 order of insertion. Accordingly, sets do not support indexing, slicing, or 28 other sequence-like behavior. 29 30 Most set applications use the :class:`Set` class which provides every set method 31 except for :meth:`__hash__`. For advanced applications requiring a hash method, 32 the :class:`ImmutableSet` class adds a :meth:`__hash__` method but omits methods 33 which alter the contents of the set. Both :class:`Set` and :class:`ImmutableSet` 34 derive from :class:`BaseSet`, an abstract class useful for determining whether 35 something is a set: ``isinstance(obj, BaseSet)``. 36 37 The set classes are implemented using dictionaries. Accordingly, the 38 requirements for set elements are the same as those for dictionary keys; namely, 39 that the element defines both :meth:`__eq__` and :meth:`__hash__`. As a result, 40 sets cannot contain mutable elements such as lists or dictionaries. However, 41 they can contain immutable collections such as tuples or instances of 42 :class:`ImmutableSet`. For convenience in implementing sets of sets, inner sets 43 are automatically converted to immutable form, for example, 44 ``Set([Set(['dog'])])`` is transformed to ``Set([ImmutableSet(['dog'])])``. 45 46 47 .. class:: Set([iterable]) 48 49 Constructs a new empty :class:`Set` object. If the optional *iterable* 50 parameter is supplied, updates the set with elements obtained from iteration. 51 All of the elements in *iterable* should be immutable or be transformable to an 52 immutable using the protocol described in section :ref:`immutable-transforms`. 53 54 55 .. class:: ImmutableSet([iterable]) 56 57 Constructs a new empty :class:`ImmutableSet` object. If the optional *iterable* 58 parameter is supplied, updates the set with elements obtained from iteration. 59 All of the elements in *iterable* should be immutable or be transformable to an 60 immutable using the protocol described in section :ref:`immutable-transforms`. 61 62 Because :class:`ImmutableSet` objects provide a :meth:`__hash__` method, they 63 can be used as set elements or as dictionary keys. :class:`ImmutableSet` 64 objects do not have methods for adding or removing elements, so all of the 65 elements must be known when the constructor is called. 66 67 68 .. _set-objects: 69 70 Set Objects 71 ----------- 72 73 Instances of :class:`Set` and :class:`ImmutableSet` both provide the following 74 operations: 75 76 +-------------------------------+------------+---------------------------------+ 77 | Operation | Equivalent | Result | 78 +===============================+============+=================================+ 79 | ``len(s)`` | | number of elements in set *s* | 80 | | | (cardinality) | 81 +-------------------------------+------------+---------------------------------+ 82 | ``x in s`` | | test *x* for membership in *s* | 83 +-------------------------------+------------+---------------------------------+ 84 | ``x not in s`` | | test *x* for non-membership in | 85 | | | *s* | 86 +-------------------------------+------------+---------------------------------+ 87 | ``s.issubset(t)`` | ``s <= t`` | test whether every element in | 88 | | | *s* is in *t* | 89 +-------------------------------+------------+---------------------------------+ 90 | ``s.issuperset(t)`` | ``s >= t`` | test whether every element in | 91 | | | *t* is in *s* | 92 +-------------------------------+------------+---------------------------------+ 93 | ``s.union(t)`` | ``s | t`` | new set with elements from both | 94 | | | *s* and *t* | 95 +-------------------------------+------------+---------------------------------+ 96 | ``s.intersection(t)`` | ``s & t`` | new set with elements common to | 97 | | | *s* and *t* | 98 +-------------------------------+------------+---------------------------------+ 99 | ``s.difference(t)`` | ``s - t`` | new set with elements in *s* | 100 | | | but not in *t* | 101 +-------------------------------+------------+---------------------------------+ 102 | ``s.symmetric_difference(t)`` | ``s ^ t`` | new set with elements in either | 103 | | | *s* or *t* but not both | 104 +-------------------------------+------------+---------------------------------+ 105 | ``s.copy()`` | | new set with a shallow copy of | 106 | | | *s* | 107 +-------------------------------+------------+---------------------------------+ 108 109 Note, the non-operator versions of :meth:`union`, :meth:`intersection`, 110 :meth:`difference`, and :meth:`symmetric_difference` will accept any iterable as 111 an argument. In contrast, their operator based counterparts require their 112 arguments to be sets. This precludes error-prone constructions like 113 ``Set('abc') & 'cbs'`` in favor of the more readable 114 ``Set('abc').intersection('cbs')``. 115 116 .. versionchanged:: 2.3.1 117 Formerly all arguments were required to be sets. 118 119 In addition, both :class:`Set` and :class:`ImmutableSet` support set to set 120 comparisons. Two sets are equal if and only if every element of each set is 121 contained in the other (each is a subset of the other). A set is less than 122 another set if and only if the first set is a proper subset of the second set 123 (is a subset, but is not equal). A set is greater than another set if and only 124 if the first set is a proper superset of the second set (is a superset, but is 125 not equal). 126 127 The subset and equality comparisons do not generalize to a complete ordering 128 function. For example, any two disjoint sets are not equal and are not subsets 129 of each other, so *all* of the following return ``False``: ``a<b``, ``a==b``, 130 or ``a>b``. Accordingly, sets do not implement the :meth:`__cmp__` method. 131 132 Since sets only define partial ordering (subset relationships), the output of 133 the :meth:`list.sort` method is undefined for lists of sets. 134 135 The following table lists operations available in :class:`ImmutableSet` but not 136 found in :class:`Set`: 137 138 +-------------+------------------------------+ 139 | Operation | Result | 140 +=============+==============================+ 141 | ``hash(s)`` | returns a hash value for *s* | 142 +-------------+------------------------------+ 143 144 The following table lists operations available in :class:`Set` but not found in 145 :class:`ImmutableSet`: 146 147 +--------------------------------------+-------------+---------------------------------+ 148 | Operation | Equivalent | Result | 149 +======================================+=============+=================================+ 150 | ``s.update(t)`` | *s* \|= *t* | return set *s* with elements | 151 | | | added from *t* | 152 +--------------------------------------+-------------+---------------------------------+ 153 | ``s.intersection_update(t)`` | *s* &= *t* | return set *s* keeping only | 154 | | | elements also found in *t* | 155 +--------------------------------------+-------------+---------------------------------+ 156 | ``s.difference_update(t)`` | *s* -= *t* | return set *s* after removing | 157 | | | elements found in *t* | 158 +--------------------------------------+-------------+---------------------------------+ 159 | ``s.symmetric_difference_update(t)`` | *s* ^= *t* | return set *s* with elements | 160 | | | from *s* or *t* but not both | 161 +--------------------------------------+-------------+---------------------------------+ 162 | ``s.add(x)`` | | add element *x* to set *s* | 163 +--------------------------------------+-------------+---------------------------------+ 164 | ``s.remove(x)`` | | remove *x* from set *s*; raises | 165 | | | :exc:`KeyError` if not present | 166 +--------------------------------------+-------------+---------------------------------+ 167 | ``s.discard(x)`` | | removes *x* from set *s* if | 168 | | | present | 169 +--------------------------------------+-------------+---------------------------------+ 170 | ``s.pop()`` | | remove and return an arbitrary | 171 | | | element from *s*; raises | 172 | | | :exc:`KeyError` if empty | 173 +--------------------------------------+-------------+---------------------------------+ 174 | ``s.clear()`` | | remove all elements from set | 175 | | | *s* | 176 +--------------------------------------+-------------+---------------------------------+ 177 178 Note, the non-operator versions of :meth:`update`, :meth:`intersection_update`, 179 :meth:`difference_update`, and :meth:`symmetric_difference_update` will accept 180 any iterable as an argument. 181 182 .. versionchanged:: 2.3.1 183 Formerly all arguments were required to be sets. 184 185 Also note, the module also includes a :meth:`union_update` method which is an 186 alias for :meth:`update`. The method is included for backwards compatibility. 187 Programmers should prefer the :meth:`update` method because it is supported by 188 the built-in :class:`set()` and :class:`frozenset()` types. 189 190 191 .. _set-example: 192 193 Example 194 ------- 195 196 >>> from sets import Set 197 >>> engineers = Set(['John', 'Jane', 'Jack', 'Janice']) 198 >>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice']) 199 >>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack']) 200 >>> employees = engineers | programmers | managers # union 201 >>> engineering_management = engineers & managers # intersection 202 >>> fulltime_management = managers - engineers - programmers # difference 203 >>> engineers.add('Marvin') # add element 204 >>> print engineers # doctest: +SKIP 205 Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack']) 206 >>> employees.issuperset(engineers) # superset test 207 False 208 >>> employees.update(engineers) # update from another set 209 >>> employees.issuperset(engineers) 210 True 211 >>> for group in [engineers, programmers, managers, employees]: # doctest: +SKIP 212 ... group.discard('Susan') # unconditionally remove element 213 ... print group 214 ... 215 Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack']) 216 Set(['Janice', 'Jack', 'Sam']) 217 Set(['Jane', 'Zack', 'Jack']) 218 Set(['Jack', 'Sam', 'Jane', 'Marvin', 'Janice', 'John', 'Zack']) 219 220 221 .. _immutable-transforms: 222 223 Protocol for automatic conversion to immutable 224 ---------------------------------------------- 225 226 Sets can only contain immutable elements. For convenience, mutable :class:`Set` 227 objects are automatically copied to an :class:`ImmutableSet` before being added 228 as a set element. 229 230 The mechanism is to always add a :term:`hashable` element, or if it is not 231 hashable, the element is checked to see if it has an :meth:`__as_immutable__` 232 method which returns an immutable equivalent. 233 234 Since :class:`Set` objects have a :meth:`__as_immutable__` method returning an 235 instance of :class:`ImmutableSet`, it is possible to construct sets of sets. 236 237 A similar mechanism is needed by the :meth:`__contains__` and :meth:`remove` 238 methods which need to hash an element to check for membership in a set. Those 239 methods check an element for hashability and, if not, check for a 240 :meth:`__as_temporarily_immutable__` method which returns the element wrapped by 241 a class that provides temporary methods for :meth:`__hash__`, :meth:`__eq__`, 242 and :meth:`__ne__`. 243 244 The alternate mechanism spares the need to build a separate copy of the original 245 mutable object. 246 247 :class:`Set` objects implement the :meth:`__as_temporarily_immutable__` method 248 which returns the :class:`Set` object wrapped by a new class 249 :class:`_TemporarilyImmutableSet`. 250 251 The two mechanisms for adding hashability are normally invisible to the user; 252 however, a conflict can arise in a multi-threaded environment where one thread 253 is updating a set while another has temporarily wrapped it in 254 :class:`_TemporarilyImmutableSet`. In other words, sets of mutable sets are not 255 thread-safe. 256 257 258 .. _comparison-to-builtin-set: 259 260 Comparison to the built-in :class:`set` types 261 --------------------------------------------- 262 263 The built-in :class:`set` and :class:`frozenset` types were designed based on 264 lessons learned from the :mod:`sets` module. The key differences are: 265 266 * :class:`Set` and :class:`ImmutableSet` were renamed to :class:`set` and 267 :class:`frozenset`. 268 269 * There is no equivalent to :class:`BaseSet`. Instead, use ``isinstance(x, 270 (set, frozenset))``. 271 272 * The hash algorithm for the built-ins performs significantly better (fewer 273 collisions) for most datasets. 274 275 * The built-in versions have more space efficient pickles. 276 277 * The built-in versions do not have a :meth:`union_update` method. Instead, use 278 the :meth:`update` method which is equivalent. 279 280 * The built-in versions do not have a ``_repr(sorted=True)`` method. 281 Instead, use the built-in :func:`repr` and :func:`sorted` functions: 282 ``repr(sorted(s))``. 283 284 * The built-in version does not have a protocol for automatic conversion to 285 immutable. Many found this feature to be confusing and no one in the community 286 reported having found real uses for it. 287 288