13. Sets and Frozen Sets
By Bernd Klein. Last modified: 29 Jun 2022.
Introduction
In this chapter of our tutorial, we are dealing with Python's implementation of sets. Though sets are nowadays an integral part of modern mathematics, this has not always been the case. The set theory had been rejected by many, even by some great thinkers. One of them was the philosopher Wittgenstein. He didn't like the set theory and complained mathematics is "ridden through and through with the pernicious idioms of set theory...". He dismissed the set theory as "utter nonsense", as being "laughable" and "wrong". His criticism appeared years after the death of the German mathematician Georg Cantor, the founder of the set theory. David Hilbert defended it from its critics by famously declaring: "No one shall expel us from the Paradise that Cantor has created.
Cantor defined a set at the beginning of his "Beiträge zur Begründung der transfiniten Mengenlehre" as: "A set is a gathering together into a whole of definite, distinct objects of our perception and of our thought - which are called elements of the set." Nowadays, we can say in "plain" English: A set is a well-defined collection of objects.
The elements or members of a set can be anything: numbers, characters, words, names, letters of the alphabet, even other sets, and so on. Sets are usually denoted with capital letters. This is not the exact mathematical definition, but it is good enough for the following.
The data type "set", which is a collection type, has been part of Python since version 2.4. A set contains an unordered collection of unique and immutable objects. The set data type is, as the name implies, a Python implementation of the sets as they are known from mathematics. This explains, why sets unlike lists or tuples can't have multiple occurrences of the same element.
Live Python training
See our Python training courses
Sets
If we want to create a set, we can call the built-in set function with a sequence or another iterable object.
In the following example, a string is singularized into its characters to build the resulting set x:
x = set("A Python Tutorial")
x
OUTPUT:
{' ', 'A', 'P', 'T', 'a', 'h', 'i', 'l', 'n', 'o', 'r', 't', 'u', 'y'}
type(x)
OUTPUT:
set
We can pass a list to the built-in set function, as we can see in the following:
x = set(["Perl", "Python", "Java"])
x
OUTPUT:
{'Java', 'Perl', 'Python'}
Now, we want to show what happens, if we pass a tuple with reappearing elements to the set function - in our example the city "Paris":
cities = set(("Paris", "Lyon", "London","Berlin","Paris","Birmingham"))
cities
OUTPUT:
{'Berlin', 'Birmingham', 'London', 'Lyon', 'Paris'}
As we have expected, no doubles occur in the resulting set of cities.
Immutable Sets
Sets are implemented in a way, which doesn't allow mutable objects. The following example demonstrates that we cannot include, for example, lists as elements:
cities = set((["Python","Perl"], ["Paris", "Berlin", "London"]))
cities
OUTPUT:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-2-5a60d6eeb901> in <module> ----> 1 cities = set((["Python","Perl"], ["Paris", "Berlin", "London"])) 2 3 cities TypeError: unhashable type: 'list'
Tuples on the other hand are fine:
cities = set((("Python","Perl"), ("Paris", "Berlin", "London")))
