Set - это множество, в котором элементы не повторяются. Элементы множества никак не упорядочены. Создание множества:
a = set()
a.add(3) # добавление элемента, O(1)
b = {5}
print(a, b)
c = {4, 4, 2, 6} # элементы не повторяются
print(c) # порядок элементов не важен
lst = [7, 1, 3, 3, 8]
a = set(lst) # приведение списка к множеству (выкинули повторения)
print(a)
print(list(a)) # приведение множества к списку
Чтобы проверить, находится ли элемент в множестве, можно использовать оператор in. В среднем такая проверка занимает O(1).
b = {4, 5}
print(b)
print(5 in b)
if 8 in b:
print("YES")
else:
print("NO")
print(len(b)) # размер (мощность) множества - количество элементов
Удаление элемента из множества, в среднем за O(1):
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)
Над двумя множествами A и B можно производить операции:
a = {2, 3, 4}
b = {5, 2}
print(a | b) # объединение (or)
print(a - b) # разность
print(a & b) # пересечение (and)
print(a ^ b) # симметричная разность (xor)
В питоне два множества можно сравнить. Множество A меньше множества B, если все элементы множества A содержатся в множестве B, и при этом A != B. Сравнения выполняются за O(len(A) + len(B)).
a = {2, 3, 4}
b = {4, 3, 2}
print(a, b)
# Сравнения
print(a < b)
print(a > b)
print(a >= b)
print(a == b)
a = {1, 2, 6, 9, 3}
for elem in a:
print(elem, end=" ")
print()
while a:
elem = a.pop()
print(elem, end=" ")
Так же, как и для списков, существуют генераторы множеств:
a = {i ** 2 for i in range(10)}
print(a)
Map применяет функцию (первый параметр) к каждому элементу из списка (второй параметр).
lst = list(map(min, [[4, 0], [5, 7], [7]]))
print(lst, type(lst[0]))
Оператор * распаковывает список в параметры функции.
lst = [[1], [3], [5], [3]]
print(*lst)
Тут, вроде бы, ничего нового:
a, b, c = 1, 2, 3
print(a, b, c)
a, b, c = [1, 2, 3]
print(a, b, c)
a, b, c = (2 * i + 1 for i in range(3))
print(a, b, c)
Но в 3-м питоне можно ещё и так:
a, (b, c), d = [1, (2, 3), 4]
print(a, b, c, d)
a, b, *c = [1, 2, 3, 4, 5]
print(a, b, c)
Zip берёт первые элементы списка и объединяет их в один кортеж. Потом берёт вторые и тоже объединяет. И так далее. Если где-то есть лишние элементы, которые нельзя "запаковать", то они игнорируются.
a = [1, 2, 4, 8]
b = [5, 6, 3]
print(list(zip(a, b)))
print(list(zip(b, a)))
for x, y in zip(a, b):
print(x, y)
c = [3, 4]
print(list(zip(a, b, c)))
О, но так же можно и матрицу повернуть!
matrix = [[1, 0, 0, 0],
[0, 1, 0, 2],
[0, 0, 1, 0],
[4, 1, 1, 1]]
turned_matrix = [list(row) for row in zip(*matrix)]
print(turned_matrix)
print(list(map(list, zip(*matrix))))
Я, как всегда, забыл, как работает remove. Если элемента в списке нет, что произойдёт?
help(list.remove)
print(dir(set))
# help(set) - попробуйте сами
Словари - это пары (ключ, значение). Создание словаря:
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")
c['hello'] = 'world' # добавление элемента, O(1)
e['one'] = 8 # изменение элемента, O(1)
e.pop('two') # удаление элемента, O(1)
print(c, e, sep="\n")
print(b[1], d["a"], b.get("4"), b.get("8"), e.get("three", 0)) # e[0] - KeyError
to_sort = [(3, 4), 1, 1, 6, 7, 1, 6, "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)
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, a[x], end=" ")
print()
for x in a.values():
print(x, end=" ")
print()
print(len(a))
Анонимные функции без названия
print(list(map(lambda x: int(x) - 1, input().split())))
print([int(x) - 1 for x in input().split()])
lst = [3, 5, 6]
func_array = [min, max, lambda x: x[0] * 4]
[func(lst) for func in func_array]
lst = [1, 900, 6, 2, 332040, 0, 111111, 54]
lst = [(4, 5), (3, 8)]
lst.sort(key=lambda x: x[0])
print(lst)
def f(func, x, y):
return func(x, y)
vector_len = lambda x, y: (x ** 2 + y ** 2) ** 0.5
print(vector_len(3, 4))
print(vector_len(-3, 7))
# Можно функции использовать почти как обычные переменные
another_name = vector_len
print(another_name(1, 1))
print(f(lambda x, y: y, 1, 3))
# Пронумеровать список
a = ['Hello', 'world', '!']
for i, x in enumerate(a):
print('{}: {}'.format(i, x))
# То же самое:
for i in range(len(a)):
print('%d: %s' % (i, a[i]))
# Инвертировать словарь
m = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
dict(zip(m.values(), m.keys()))
# В генераторах можно писать и if
[x * 2 for x in range(20) if x % 3 == 1]
# if в одну строчку
print("YES" if 5 % 2 == 1 else "NO")
# Словарь со значением по умолчанию
from collections import defaultdict
d = defaultdict(int)
d["a"] += 5
print(d)
d = {}
d["a"] = d.get("a", 0) + 5
print(d)
d2 = defaultdict(lambda: 'abc')
d2[3] += 'a'
print(d2)