Python’s built-in set type has the following characteristics:
Let’s see what all that means, and how you can work with sets in Python.
A set can be created in two ways. First, you can define a set with the built-in set() function:
x = set(<iter>)In this case, the argument <iter> is an iterable—again, for the moment, think list or tuple—that generates the list of objects to be included in the set. This is analogous to the <iter>argument given to the .extend() list method:
>>> x = set(['foo', 'bar', 'baz', 'foo', 'qux'])>>> x{'qux', 'foo', 'bar', 'baz'}>>> x = set(('foo', 'bar', 'baz', 'foo', 'qux'))>>> x{'qux', 'foo', 'bar', 'baz'}Strings are also iterable, so a string can be passed to set() as well. You have already seen that list(s) generates a list of the characters in the string s. Similarly, set(s) generates a set of the characters in s:
>>> s = 'quux'>>> list(s)['q', 'u', 'u', 'x']>>> set(s){'x', 'u', 'q'}You can see that the resulting sets are unordered: the original order, as specified in the definition, is not necessarily preserved. Additionally, duplicate values are only represented in the set once, as with the string 'foo' in the first two examples and the letter 'u' in the third.
Alternately, a set can be defined with curly braces ({}):
x = {<obj>, <obj>, ..., <obj>}When a set is defined this way, each <obj> becomes a distinct element of the set, even if it is an iterable. This behavior is similar to that of the .append() list method.
Thus, the sets shown above can also be defined like this:
>>> x = {'foo', 'bar', 'baz', 'foo', 'qux'}>>> x{'qux', 'foo', 'bar', 'baz'}>>> x = {'q', 'u', 'u', 'x'}>>> x{'x', 'q', 'u'}To recap:
set() is an iterable. It generates a list of elements to be placed into the set.Observe the difference between these two set definitions:
>>> {'foo'}{'foo'}>>> set('foo'){'o', 'f'}A set can be empty. However, recall that Python interprets empty curly braces ({}) as an empty dictionary, so the only way to define an empty set is with the set() function:
>>> x = set()>>> type(x)<class 'set'>>>> xset()>>> x = {}>>> type(x)<class 'dict'>An empty set is falsy in Boolean context:
>>> x = set()>>> bool(x)False>>> x or 11>>> x and 1set()You might think the most intuitive sets would contain similar objects—for example, even numbers or surnames:
>>> s1 = {2, 4, 6, 8, 10}>>> s2 = {'Smith', 'McArthur', 'Wilson', 'Johansson'}Python does not require this, though. The elements in a set can be objects of different types:
>>> x = {42, 'foo', 3.14159, None}>>> x{None, 'foo', 42, 3.14159}Don’t forget that set elements must be immutable. For example, a tuple may be included in a set:
>>> x = {42, 'foo', (1, 2, 3), 3.14159}>>> x{42, 'foo', 3.14159, (1, 2, 3)}But lists and dictionaries are mutable, so they can’t be set elements:
>>> a = [1, 2, 3]>>> {a}Traceback (most recent call last): File "<pyshell#70>", line 1, in <module> {a}TypeError: unhashable type: 'list'>>> d = {'a': 1, 'b': 2}>>> {d}Traceback (most recent call last): File "<pyshell#72>", line 1, in <module> {d}TypeError: unhashable type: 'dict'