In Python we have some immutable types. With immutable collections, we can simplify some logic in programs. An immutable thing is frozen in place.
With frozenset
, we have an immutable set. We cannot add or remove elements. In every other way it is like a set. And because it cannot be changed, it can be used as a dictionary key.
Here is an example that uses the frozenset
keyword. We create an immutable set of strings (bird, plant and fish).
frozenset
can be used where a set cannot. It can be a dictionary key or a set element itself.frozenset
with the frozenset()
built-in. We pass it a list of strings.# Strings to put in frozenset. keys = ["bird", "plant", "fish"] # Create frozenset. f = frozenset(keys) print(f) # Cannot add to frozenset. try: f.add("cat") except AttributeError: print("Cannot add") # Can use frozenset as key to dictionary. d = {} d[f] = "awesome" print(d)frozenset({'plant', 'bird', 'fish'}) Cannot add {frozenset({'plant', 'bird', 'fish'}): 'awesome'}
Let us try to create a frozenset
of frozensets. With sets, this is not possible, but frozensets can be hashed like other values.
frozenset
that contains possible color pairs (which are stored as frozensets also).frozenset
to see whether a pair of colors exists. This uses hashing.# Create 3 frozensets. colors1 = frozenset(["blue", "red"]) colors2 = frozenset(["orange", "black"]) colors3 = frozenset(["black", "white"]) # Create a frozenset of two frozensets. possible = frozenset([colors1, colors2]) # This frozenset is included. if colors1 in possible: print("Possible:", colors1) # This one is not. if colors3 not in possible: print("Not possible:", colors3)Possible: frozenset({'blue', 'red'}) Not possible: frozenset({'white', 'black'})
A set cannot be hashed. So when we try to create a set of sets we will get an "objects are unhashable" error (a TypeError
).
# This example will not compile. example = {1, 2, 3} example2 = {example, {5, 6, 7}}Traceback (most recent call last): File "C:\programs\file.py", line 6, in <module> example2 = {example, {5, 6, 7}} TypeError: 'set' objects are unhashable
Here we have an immutable and hashable set. We can test a frozenset
for the existence of other pairs—this is a fast way to search for multiple elements.