Python Sets and When to Use Them
SkillVeris Team
Engineering Team

A Python set is an unordered collection of unique, hashable items — ideal for deduplication and lightning-fast membership checks.
In this guide, you'll learn:
- Create a set with curly braces or the set() function, but use set() for an empty set because {} makes an empty dictionary.
- Membership testing with 'in' is far faster on a set than on a list because sets use a hash table.
- Sets support mathematical operations: union, intersection, difference, and symmetric difference.
- Sets are mutable, but frozenset gives you an immutable, hashable version you can use as a dictionary key.
1What Is a Python Set?
A Python set is a built-in collection that stores unique, unordered items. If you add a value that already exists, the set silently ignores it, so a set can never contain duplicates. This makes sets the natural tool for removing repeats and for asking whether an item is present.
Sets are written with curly braces around comma-separated values. Because they are unordered, they have no index — you cannot ask for the first or third element — but they excel at the two things they do: guaranteeing uniqueness and testing membership quickly.
- colors = {'red', 'green', 'blue'}
- colors.add('red') # ignored, already present
- print(len(colors)) # 3
- empty = set() # correct way to make an empty set
2Why Sets Are Fast
Sets are backed by a hash table, the same structure behind dictionaries. This means checking whether an item exists takes roughly constant time regardless of how many elements the set holds. A list, by contrast, must scan element by element, which slows down as it grows.
- big_list = list(range(1_000_000))
- big_set = set(big_list)
- 999_999 in big_list # slow: scans the list
- 999_999 in big_set # fast: hash lookup
🔑Key Idea
If your code repeatedly checks 'is this item already seen?', converting the collection to a set can turn a slow loop into an instant one.
3Creating Sets and Removing Duplicates
The most common real-world use of a set is deduplication. Passing any iterable to set() strips duplicates in one step, and wrapping the result in list() gives you back a list of unique values when you need ordered output.
- nums = [1, 2, 2, 3, 3, 3]
- unique = set(nums) # {1, 2, 3}
- unique_list = list(set(nums)) # back to a list
- letters = set('mississippi') # {'m', 'i', 's', 'p'}
⚠️Watch Out
Converting to a set discards order and duplicates. If you must keep the original order, use dict.fromkeys(nums) instead, which preserves insertion order while removing repeats.
4Adding and Removing Elements
Sets are mutable, so you can add and remove items after creation. Use .add() for a single element and .update() to add many at once. For removal, .discard() is safer than .remove() because it does not raise an error on a missing item.
- s = {1, 2, 3}
- s.add(4) # {1, 2, 3, 4}
- s.update([5, 6]) # add multiple
- s.remove(10) # raises KeyError if absent
- s.discard(10) # no error if absent
- s.pop() # remove and return an arbitrary element
5Set Operations
Sets support mathematical operations that make comparing two collections concise. These replace nested loops with a single, readable expression and are among the strongest reasons to use sets.
- a = {1, 2, 3}; b = {3, 4, 5}
- a | b # union: {1, 2, 3, 4, 5}
- a & b # intersection: {3}
- a - b # difference: {1, 2}
- a ^ b # symmetric difference: {1, 2, 4, 5}
Method Equivalents
Each operator has a named-method form that accepts any iterable, not just another set. This is handy when your other collection is a list.
a.union([4, 5])
a.intersection([2, 3])
a.difference([3])
a.issubset({1, 2, 3, 4}) # True6Immutable Sets With frozenset
A regular set cannot be used as a dictionary key or placed inside another set because it is mutable and therefore unhashable. When you need an immutable set, use frozenset. It supports all the read operations of a set but cannot be changed after creation.
- fs = frozenset([1, 2, 3])
- cache = {fs: 'result'} # valid dictionary key
- nested = {frozenset({1, 2}), frozenset({3, 4})} # set of sets
7When to Use a Set
Choosing the right structure comes down to what your data needs. Sets are the right call in specific situations and the wrong one in others.
- Use a set to remove duplicates from a collection.
- Use a set for fast membership tests inside loops.
- Use a set to compare collections with union, intersection, or difference.
- Avoid sets when you need to preserve order or keep duplicates.
- Avoid sets when you need indexed access like collection[0].
Set vs List vs Dictionary
A list keeps order and allows duplicates; a set enforces uniqueness with no order; a dictionary maps keys to values. Pick based on whether you care about order, uniqueness, or associations.
8Common Mistakes to Avoid
A few recurring mistakes trip up people new to sets. Keep these in mind and you will avoid the most common surprises.
- Using {} to make an empty set — it creates an empty dictionary; use set() instead.
- Expecting a set to keep order — iteration order is not guaranteed to match insertion.
- Trying to index a set with s[0] — sets have no positions and this raises a TypeError.
- Adding an unhashable item like a list — use a tuple or frozenset instead.
- Using .remove() on a possibly-missing item — prefer .discard() to avoid KeyError.
9Key Takeaways
The essentials of Python sets come down to uniqueness and speed.
- A set stores unique, unordered, hashable items.
- set() deduplicates any iterable in one step.
- Membership tests with 'in' are much faster than on a list.
- Union, intersection, and difference compare collections concisely.
- Use frozenset when you need an immutable, hashable set.
10Frequently Asked Questions
Q: How do I create an empty set in Python? A: Use set(). Writing {} creates an empty dictionary, not a set, because the curly-brace syntax defaults to a dictionary when there are no elements.
Q: Are Python sets ordered? A: No. Sets are unordered, so you cannot rely on iteration returning elements in any particular sequence, and you cannot access elements by index. If you need order, use a list.
Q: Why is checking membership faster in a set than a list? A: Sets use a hash table, so 'x in s' computes a hash and jumps straight to the bucket in roughly constant time. A list must scan items one by one, which grows slower as the list lengthens.
Q: What is the difference between a set and a frozenset? A: A set is mutable — you can add and remove items. A frozenset is immutable and hashable, so it can be used as a dictionary key or stored inside another set, but it cannot be changed after creation.
Related Reading
Get The Print Version
Download a PDF of this article for offline reading.
About the Publisher
SkillVeris Team
Engineering Team
Our engineering writers turn abstract code concepts into hands-on, project-driven learning experiences.
View all postsRelated Posts
Never miss an update
Get the latest tutorials and guides delivered to your inbox.
No spam. Unsubscribe anytime.