Many algorithms need to work with simple containers of data values,
irrespective of order or any key. This is a simple set of objects, which
is supported by the Python set container. We'll look at Sets from a number
of viewpoints: semantics, literal values, operations, comparison
operators, statements, built-in functions and methods.

A `set`

is, perhaps the simplest possible
container, since it contains objects in no particular order with no
particular identification. Objects stand for themselves. With a
sequence, objects are identified by position. With a mapping, objects
are identified by some key. With a `set`

, objects
stand for themselves.

Since each object stands for itself, elements of a
`set`

cannot be duplicated. A
`list`

or `tuple`

, for
example, can have any number of duplicate objects. For example, the
`tuple`

`( 1, 1, 2, 3 )`

has four
elements, which includes two copies of the integer `1`

;
if we create a `set`

from this
`tuple`

, the `set`

will only
have three elements.

A `set`

has large number of operations for
unions, intersections, and differences. A common need is to examine a
`set`

to see if a particular object is a member of
that `set`

, or if one `set`

is
contained within another `set`

.

A `set`

is mutable, which means that it
cannot be used as a key for a `dict`

(see Chapter 15, *Mappings and Dictionaries*
for more information.) In order to use a
`set`

as a `dict`

key, we can
create a `frozenset`

, which is an immutable copy of
the original `set`

. This allows us to accumulate a
`set`

of values to create a
`dict`

key.