# контейнеры

# списки
a = list()  # или   a = []
print(a)

# добавим числа от 1 до 9
for i in range(1, 10):
    a.append(i)
print(a)

print(len(a))  # размер списка

print(a[0])    # первый элемент, индексация с 0

print(a[len(a) - 1])  # последний элемент можно достать так...
print(a[-1])          # ...а можно так -- отрицательная индексация для элементов с конца

a[1] = 100  # можно менять элементы
print(a)

a.pop(1)    # можно удалять по индексу
print(a)

a.remove(3) # а можно по значению (при этом удаляется первый подходящий)
print(a)

print(a.index(9)) # можно узнать индекс по значению (тоже первого подходящего)

a.clear()  # а можно вообще всё удалить сразу
print(a)

b = [1, 2, 3, "a", "abc", [1, 2, 3]]  # можно хранить разные типы данных, в том числе списки внутри других списков
print(b)


# кортежи

c = tuple()
print(c)

# нельзя изменять, только читать

c = (1, 2, 3)
print(c)
print(c[0])
print(len(c))
print(c.index(2))

c1 = list(c)  # можно конвертировать в список (и тогда этот список уже станет можно изменять)
print(c1)

# это были упорядоченные коллекции

# словарь

d = dict()
print(d)

# в словарях данные хранятся парами: ключ + значение. можно добавить новые значения вот так:
d["a"] = 1
d["b"] = 2
print(d)
print(len(d))

print(d["a"])  # по ключу можно читать

# не любые типы данных можно использовать как ключ
# d[[1, 2, 3]] = 3 -- например так не получится сделать

d[4] = (4, 5)           # а так получится
d[(1, 2, 3)] = "abc"    # и так тоже
                        # как ключ можно использовать что-то, что не будет меняться: строка, число, кортеж...
                        # значением же может быть что угодно
print(d)

d.pop("a")  # удаление по ключу
print(d)

d.clear()   # можно всё удалить
print(d)


# множества
e = set()   # или   e = {} -- тут внимательно, это будет не словарь, а множество, хотя символы одинаковые, казалось бы
print(e)

for i in range(1, 10):
    e.add(i)  # добавляем числа от 1 до 9
print(e)
print(len(e))

e.add(1)
e.add(1)
e.add(1)
print(e)  # только уникальные элементы

# множество не хранит индексы элементов, поэтому по индексу нельзя обратиться
# e[0] -- так не получится

e.remove(1)  # можно удалять
print(e)

e.clear()  # можно почистить
print(e)
