Контейнеры

Множество (set)

Set — это множество, в котором элементы не повторяются. Элементы множества никак не упорядочены.

Создание множества


In [1]:
a = set()
a.add(3)  # Добавление элемента, O(1)
b = {5}
print(a, b)


{3} {5}

In [2]:
c = {4, 4, 2, 6}  # Элементы не повторяются
print(c)  # Порядок элементов не важен


{2, 4, 6}

Приведение к списку

Можно приводить список к множеству или множество к списку:


In [3]:
lst = [8, 1, 3, 3, 8]
a = set(lst)  # Приведение списка к множеству (выкинули повторения)
print(a)

print(list(a))  # Приведение множества к списку


{8, 1, 3}
[8, 1, 3]

Генератор множества


In [4]:
a = {i ** 2 for i in range(10)}
print(a)


{0, 1, 64, 4, 36, 9, 16, 49, 81, 25}

Стандартные операции

Вхождение элемента в множество

Чтобы проверить, находится ли элемент в множестве, можно использовать оператор in. В среднем такая проверка занимает O(1).


In [5]:
b = {4, 5}
print(b)

print(5 in b)
if 8 in b:
    print("YES")
else:
    print("NO")


{4, 5}
True
NO

Удаление элемента

Удаление элемента из множества, в среднем за O(1):


In [6]:
a = {1, 2, 4, 5, 6}
a.discard(5)
print(a)
a.remove(4)
print(a)

a.discard(8000)  # Игнорирует команду, если элемента нет
print(a)
a.remove(8000)  # Кидает ошибку, если элемента нет
print(a)


{1, 2, 4, 6}
{1, 2, 6}
{1, 2, 6}
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-6-5a1c791a6e29> in <module>()
      7 a.discard(8000)  # Игнорирует команду, если элемента нет
      8 print(a)
----> 9 a.remove(8000)  # Кидает ошибку, если элемента нет
     10 print(a)

KeyError: 8000

Размер множества

Вычисление размера (мощности) множества:


In [7]:
b = {4, 5}
print(len(b))


2

Проход по множеству


In [8]:
a = {1, 2, 6, 9, 3}

for elem in a:
    print(elem, end=" ")
print()

while a:
    elem = a.pop()  # Вытаскивает элемент из множества
    print(elem, end=" ")


1 2 3 6 9 
1 2 3 6 9 

Операции над двумя множествами

Объединение

В объединение входят элементы, которые есть или в первом, или во втором множестве. В среднем работает за O(len(A) + len(B)).


In [9]:
a = {2, 3, 4}
b = {5, 2}
print(a | b)


{2, 3, 4, 5}

Разность

Из элементов первого множества вычёркиваются элементы второго множества. В среднем работает за O(len(A)).


In [10]:
a = {2, 3, 4}
b = {5, 2}
print(a - b)


{3, 4}

Пересечение

В пересечение входят только те элементы, которые есть и в первом, и во втором множестве. В среднем работает за O(min(len(A), len(B))).


In [11]:
a = {2, 3, 4}
b = {5, 2}
print(a & b)


{2}

Симметрическая разность

Элементы входят либо только в первое, либо только во второе множество. В среднем работает за O(len(A) + len(B)).


In [12]:
a = {2, 3, 4}
b = {5, 2}
print(a ^ b)


{3, 4, 5}

Сравнение

В питоне два множества можно сравнить. Множество A меньше множества B, если все элементы множества A содержатся в множестве B, и при этом A != B. Сравнения выполняются за O(len(A) + len(B)).


In [13]:
a = {2, 3, 4}
b = {3, 4}

# Сравнения
print(a < b)
print(a > b)
print(a >= b)
print(a == b)


False
True
True
False

Словарь (dict)

Словари — это пары (ключ, значение).

Создание словаря


In [14]:
a = {}
b = {1: 3, "4": 8}
c = dict()
d = dict(((1, 2), ("a", 13)))
e = dict(one=1, two=2)
print(a, b, c, d, e, sep="\n", end="\n\n")


{}
{1: 3, '4': 8}
{}
{1: 2, 'a': 13}
{'one': 1, 'two': 2}

Стандартные операции

Добавление элемента


In [15]:
a = {}
a['hello'] = 'world'  # Добавление элемента, O(1)
print(a)


{'hello': 'world'}

Изменение элемента


In [16]:
a = {'one': 1, 'two': 2}
a['one'] = 8  # Изменение элемента, O(1)
print(a)


{'one': 8, 'two': 2}

Удаление элемента


In [17]:
a = {'one': 1, 'two': 2}
a.pop('two')  # Удаление элемента, O(1)
print(a)


{'one': 1}

Обращение к элементам


In [18]:
b = {1: 3, '4': 8, 'a': 13}
print(b[1], b['a'], b.get('4'))  # Существующие элементы
print(b.get('8'), b.get('three', 0))  # Несуществующие элементы со значением по умолчанию
print(b[0])  # b[0] - KeyError


3 13 8
None 0
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-18-2c42e8e831b1> in <module>()
      2 print(b[1], b['a'], b.get('4'))  # Существующие элементы
      3 print(b.get('8'), b.get('three', 0))  # Несуществующие элементы со значением по умолчанию
----> 4 print(b[0])  # b[0] - KeyError

KeyError: 0

Размер словаря


In [19]:
a = {"a": 18, "b": 10, "c": 13}
print(len(a))


3

Проход по словарю

  • dict.items() - кортежи из пар (ключ, значение)
  • dict.keys() - список ключей
  • dict.values() - список значений

In [20]:
a = {"a": 18, "b": 10, "c": 13}

for x, y in a.items():
    print("%s: %s" % (x, y))
print()

for x in a.keys():
    print(x, end=" ")
print()

for x in a.values():
    print(x, end=" ")
print()


a: 18
b: 10
c: 13

a b c 
18 10 13 

Пример использования


In [21]:
to_sort = ["5", "2", "2", "2", "1", "1", "1", "0", "3", "3", "2", "2", "5", "5", "5", "3", "1"]

count_sort = {}
for elem in to_sort:
    count_sort[elem] = count_sort.get(elem, 0) + 1

print(count_sort)


{'5': 4, '2': 5, '1': 4, '0': 1, '3': 3}