ruk·si

🐍 Python
Sets

Updated at 2018-06-09 14:26

Set is a mutable collection of unique items. They are much more efficient than lists as long as the data fits in RAM.

from typing import Set

vowels: Set[str] = {'a', 'e', 'i', 'o', 'u'}
assert 'e' in vowels
assert 'x' not in vowels
assert len(vowels) == 5

name: Set[str] = set('alice')
assert name.intersection(vowels) == {'a', 'e', 'i'}
assert name.difference(vowels) == {'l', 'c'}
assert name.issubset({'a', 'l', 'i', 'c', 'e', 'x'})
assert {'a', 'l', 'i', 'c', 'e', 'x'}.issuperset(name)
assert name.union(vowels) == {'c', 'l', 'o', 'e', 'a', 'i', 'u'}

vowels.add('x')
assert 'x' in vowels
assert len(vowels) == 6

vowels.add('a')
assert len(vowels) == 6

Sets are a natural choice when your code has a lot of item in items checks.

Frozen set is an immutable collection of unique items.

consonants = frozenset({'b', 'c', 'd', 'f'})
# consonants.add('g') # => AttributeError

Counter is a mutable collection of unique items with counts.

from collections import Counter

inventory = Counter()
inventory.update({'sword': 3, 'shield': 1})
inventory.update({'helmet': 2, 'shield': 1})
assert len(inventory) == 3
assert sum(inventory.values()) == 7

You can do set operations with sets. Surprised?

one = {1, 2, 3}
two = {2, 3, 4}
assert one & two == {2, 3}
assert one | two == {1, 2, 3, 4}
assert one - two == {1}
assert two - one == {4}

Source

  • Python Tricks The Book, Dan Bader
  • Fluent Python, Luciano Ramalho