[2] | 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@nevex.com>
|
---|
| 9 | .. moduleauthor:: Alex Martelli <aleax@aleax.it>
|
---|
| 10 | .. moduleauthor:: Guido van Rossum <guido@python.org>
|
---|
| 11 | .. sectionauthor:: Raymond D. Hettinger <python@rcn.com>
|
---|
| 12 |
|
---|
| 13 |
|
---|
| 14 | .. versionadded:: 2.3
|
---|
| 15 |
|
---|
| 16 | .. deprecated:: 2.6
|
---|
[391] | 17 | The built-in :class:`set`/:class:`frozenset` types replace this module.
|
---|
[2] | 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)`` | | cardinality of set *s* |
|
---|
| 80 | +-------------------------------+------------+---------------------------------+
|
---|
| 81 | | ``x in s`` | | test *x* for membership in *s* |
|
---|
| 82 | +-------------------------------+------------+---------------------------------+
|
---|
| 83 | | ``x not in s`` | | test *x* for non-membership in |
|
---|
| 84 | | | | *s* |
|
---|
| 85 | +-------------------------------+------------+---------------------------------+
|
---|
| 86 | | ``s.issubset(t)`` | ``s <= t`` | test whether every element in |
|
---|
| 87 | | | | *s* is in *t* |
|
---|
| 88 | +-------------------------------+------------+---------------------------------+
|
---|
| 89 | | ``s.issuperset(t)`` | ``s >= t`` | test whether every element in |
|
---|
| 90 | | | | *t* is in *s* |
|
---|
| 91 | +-------------------------------+------------+---------------------------------+
|
---|
| 92 | | ``s.union(t)`` | ``s | t`` | new set with elements from both |
|
---|
| 93 | | | | *s* and *t* |
|
---|
| 94 | +-------------------------------+------------+---------------------------------+
|
---|
| 95 | | ``s.intersection(t)`` | ``s & t`` | new set with elements common to |
|
---|
| 96 | | | | *s* and *t* |
|
---|
| 97 | +-------------------------------+------------+---------------------------------+
|
---|
| 98 | | ``s.difference(t)`` | ``s - t`` | new set with elements in *s* |
|
---|
| 99 | | | | but not in *t* |
|
---|
| 100 | +-------------------------------+------------+---------------------------------+
|
---|
| 101 | | ``s.symmetric_difference(t)`` | ``s ^ t`` | new set with elements in either |
|
---|
| 102 | | | | *s* or *t* but not both |
|
---|
| 103 | +-------------------------------+------------+---------------------------------+
|
---|
| 104 | | ``s.copy()`` | | new set with a shallow copy of |
|
---|
| 105 | | | | *s* |
|
---|
| 106 | +-------------------------------+------------+---------------------------------+
|
---|
| 107 |
|
---|
| 108 | Note, the non-operator versions of :meth:`union`, :meth:`intersection`,
|
---|
| 109 | :meth:`difference`, and :meth:`symmetric_difference` will accept any iterable as
|
---|
| 110 | an argument. In contrast, their operator based counterparts require their
|
---|
| 111 | arguments to be sets. This precludes error-prone constructions like
|
---|
| 112 | ``Set('abc') & 'cbs'`` in favor of the more readable
|
---|
| 113 | ``Set('abc').intersection('cbs')``.
|
---|
| 114 |
|
---|
| 115 | .. versionchanged:: 2.3.1
|
---|
| 116 | Formerly all arguments were required to be sets.
|
---|
| 117 |
|
---|
| 118 | In addition, both :class:`Set` and :class:`ImmutableSet` support set to set
|
---|
| 119 | comparisons. Two sets are equal if and only if every element of each set is
|
---|
| 120 | contained in the other (each is a subset of the other). A set is less than
|
---|
| 121 | another set if and only if the first set is a proper subset of the second set
|
---|
| 122 | (is a subset, but is not equal). A set is greater than another set if and only
|
---|
| 123 | if the first set is a proper superset of the second set (is a superset, but is
|
---|
| 124 | not equal).
|
---|
| 125 |
|
---|
| 126 | The subset and equality comparisons do not generalize to a complete ordering
|
---|
| 127 | function. For example, any two disjoint sets are not equal and are not subsets
|
---|
| 128 | of each other, so *all* of the following return ``False``: ``a<b``, ``a==b``,
|
---|
| 129 | or ``a>b``. Accordingly, sets do not implement the :meth:`__cmp__` method.
|
---|
| 130 |
|
---|
| 131 | Since sets only define partial ordering (subset relationships), the output of
|
---|
| 132 | the :meth:`list.sort` method is undefined for lists of sets.
|
---|
| 133 |
|
---|
| 134 | The following table lists operations available in :class:`ImmutableSet` but not
|
---|
| 135 | found in :class:`Set`:
|
---|
| 136 |
|
---|
| 137 | +-------------+------------------------------+
|
---|
| 138 | | Operation | Result |
|
---|
| 139 | +=============+==============================+
|
---|
| 140 | | ``hash(s)`` | returns a hash value for *s* |
|
---|
| 141 | +-------------+------------------------------+
|
---|
| 142 |
|
---|
| 143 | The following table lists operations available in :class:`Set` but not found in
|
---|
| 144 | :class:`ImmutableSet`:
|
---|
| 145 |
|
---|
| 146 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 147 | | Operation | Equivalent | Result |
|
---|
| 148 | +======================================+=============+=================================+
|
---|
| 149 | | ``s.update(t)`` | *s* \|= *t* | return set *s* with elements |
|
---|
| 150 | | | | added from *t* |
|
---|
| 151 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 152 | | ``s.intersection_update(t)`` | *s* &= *t* | return set *s* keeping only |
|
---|
| 153 | | | | elements also found in *t* |
|
---|
| 154 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 155 | | ``s.difference_update(t)`` | *s* -= *t* | return set *s* after removing |
|
---|
| 156 | | | | elements found in *t* |
|
---|
| 157 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 158 | | ``s.symmetric_difference_update(t)`` | *s* ^= *t* | return set *s* with elements |
|
---|
| 159 | | | | from *s* or *t* but not both |
|
---|
| 160 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 161 | | ``s.add(x)`` | | add element *x* to set *s* |
|
---|
| 162 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 163 | | ``s.remove(x)`` | | remove *x* from set *s*; raises |
|
---|
| 164 | | | | :exc:`KeyError` if not present |
|
---|
| 165 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 166 | | ``s.discard(x)`` | | removes *x* from set *s* if |
|
---|
| 167 | | | | present |
|
---|
| 168 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 169 | | ``s.pop()`` | | remove and return an arbitrary |
|
---|
| 170 | | | | element from *s*; raises |
|
---|
| 171 | | | | :exc:`KeyError` if empty |
|
---|
| 172 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 173 | | ``s.clear()`` | | remove all elements from set |
|
---|
| 174 | | | | *s* |
|
---|
| 175 | +--------------------------------------+-------------+---------------------------------+
|
---|
| 176 |
|
---|
| 177 | Note, the non-operator versions of :meth:`update`, :meth:`intersection_update`,
|
---|
| 178 | :meth:`difference_update`, and :meth:`symmetric_difference_update` will accept
|
---|
| 179 | any iterable as an argument.
|
---|
| 180 |
|
---|
| 181 | .. versionchanged:: 2.3.1
|
---|
| 182 | Formerly all arguments were required to be sets.
|
---|
| 183 |
|
---|
| 184 | Also note, the module also includes a :meth:`union_update` method which is an
|
---|
| 185 | alias for :meth:`update`. The method is included for backwards compatibility.
|
---|
| 186 | Programmers should prefer the :meth:`update` method because it is supported by
|
---|
| 187 | the built-in :class:`set()` and :class:`frozenset()` types.
|
---|
| 188 |
|
---|
| 189 |
|
---|
| 190 | .. _set-example:
|
---|
| 191 |
|
---|
| 192 | Example
|
---|
| 193 | -------
|
---|
| 194 |
|
---|
| 195 | >>> from sets import Set
|
---|
| 196 | >>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
|
---|
| 197 | >>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
|
---|
| 198 | >>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
|
---|
| 199 | >>> employees = engineers | programmers | managers # union
|
---|
| 200 | >>> engineering_management = engineers & managers # intersection
|
---|
| 201 | >>> fulltime_management = managers - engineers - programmers # difference
|
---|
| 202 | >>> engineers.add('Marvin') # add element
|
---|
| 203 | >>> print engineers # doctest: +SKIP
|
---|
| 204 | Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack'])
|
---|
| 205 | >>> employees.issuperset(engineers) # superset test
|
---|
| 206 | False
|
---|
| 207 | >>> employees.update(engineers) # update from another set
|
---|
| 208 | >>> employees.issuperset(engineers)
|
---|
| 209 | True
|
---|
| 210 | >>> for group in [engineers, programmers, managers, employees]: # doctest: +SKIP
|
---|
| 211 | ... group.discard('Susan') # unconditionally remove element
|
---|
| 212 | ... print group
|
---|
| 213 | ...
|
---|
| 214 | Set(['Jane', 'Marvin', 'Janice', 'John', 'Jack'])
|
---|
| 215 | Set(['Janice', 'Jack', 'Sam'])
|
---|
| 216 | Set(['Jane', 'Zack', 'Jack'])
|
---|
| 217 | Set(['Jack', 'Sam', 'Jane', 'Marvin', 'Janice', 'John', 'Zack'])
|
---|
| 218 |
|
---|
| 219 |
|
---|
| 220 | .. _immutable-transforms:
|
---|
| 221 |
|
---|
| 222 | Protocol for automatic conversion to immutable
|
---|
| 223 | ----------------------------------------------
|
---|
| 224 |
|
---|
| 225 | Sets can only contain immutable elements. For convenience, mutable :class:`Set`
|
---|
| 226 | objects are automatically copied to an :class:`ImmutableSet` before being added
|
---|
| 227 | as a set element.
|
---|
| 228 |
|
---|
| 229 | The mechanism is to always add a :term:`hashable` element, or if it is not
|
---|
| 230 | hashable, the element is checked to see if it has an :meth:`__as_immutable__`
|
---|
| 231 | method which returns an immutable equivalent.
|
---|
| 232 |
|
---|
| 233 | Since :class:`Set` objects have a :meth:`__as_immutable__` method returning an
|
---|
| 234 | instance of :class:`ImmutableSet`, it is possible to construct sets of sets.
|
---|
| 235 |
|
---|
| 236 | A similar mechanism is needed by the :meth:`__contains__` and :meth:`remove`
|
---|
| 237 | methods which need to hash an element to check for membership in a set. Those
|
---|
| 238 | methods check an element for hashability and, if not, check for a
|
---|
| 239 | :meth:`__as_temporarily_immutable__` method which returns the element wrapped by
|
---|
| 240 | a class that provides temporary methods for :meth:`__hash__`, :meth:`__eq__`,
|
---|
| 241 | and :meth:`__ne__`.
|
---|
| 242 |
|
---|
| 243 | The alternate mechanism spares the need to build a separate copy of the original
|
---|
| 244 | mutable object.
|
---|
| 245 |
|
---|
| 246 | :class:`Set` objects implement the :meth:`__as_temporarily_immutable__` method
|
---|
| 247 | which returns the :class:`Set` object wrapped by a new class
|
---|
| 248 | :class:`_TemporarilyImmutableSet`.
|
---|
| 249 |
|
---|
| 250 | The two mechanisms for adding hashability are normally invisible to the user;
|
---|
| 251 | however, a conflict can arise in a multi-threaded environment where one thread
|
---|
| 252 | is updating a set while another has temporarily wrapped it in
|
---|
| 253 | :class:`_TemporarilyImmutableSet`. In other words, sets of mutable sets are not
|
---|
| 254 | thread-safe.
|
---|
| 255 |
|
---|
| 256 |
|
---|
| 257 | .. _comparison-to-builtin-set:
|
---|
| 258 |
|
---|
| 259 | Comparison to the built-in :class:`set` types
|
---|
| 260 | ---------------------------------------------
|
---|
| 261 |
|
---|
| 262 | The built-in :class:`set` and :class:`frozenset` types were designed based on
|
---|
| 263 | lessons learned from the :mod:`sets` module. The key differences are:
|
---|
| 264 |
|
---|
| 265 | * :class:`Set` and :class:`ImmutableSet` were renamed to :class:`set` and
|
---|
| 266 | :class:`frozenset`.
|
---|
| 267 |
|
---|
| 268 | * There is no equivalent to :class:`BaseSet`. Instead, use ``isinstance(x,
|
---|
| 269 | (set, frozenset))``.
|
---|
| 270 |
|
---|
| 271 | * The hash algorithm for the built-ins performs significantly better (fewer
|
---|
| 272 | collisions) for most datasets.
|
---|
| 273 |
|
---|
| 274 | * The built-in versions have more space efficient pickles.
|
---|
| 275 |
|
---|
| 276 | * The built-in versions do not have a :meth:`union_update` method. Instead, use
|
---|
| 277 | the :meth:`update` method which is equivalent.
|
---|
| 278 |
|
---|
| 279 | * The built-in versions do not have a ``_repr(sorted=True)`` method.
|
---|
| 280 | Instead, use the built-in :func:`repr` and :func:`sorted` functions:
|
---|
| 281 | ``repr(sorted(s))``.
|
---|
| 282 |
|
---|
| 283 | * The built-in version does not have a protocol for automatic conversion to
|
---|
| 284 | immutable. Many found this feature to be confusing and no one in the community
|
---|
| 285 | reported having found real uses for it.
|
---|
| 286 |
|
---|