Pattern matching позволяет проверить наличие в словаре определнных ключей и значений:
def look(words):
match words:
case {"red": "красный", "blue": "синий"}: # если в словаре words слова red и blue
print("Слова red и blue есть в словаре")
case {"red": "красный"}: # если в словаре words есть слово red
print("Слово red есть в словаре, а слово blue отсутствует")
case {"blue": "синий"}: # если в словаре words есть слово blue
print("Слово blue есть в словаре, а слово red отсутствует")
case {}:
print("Слова red и blue в словаре отсутствует")
case _:
print("Это не словарь")
look({"red": "красный", "blue": "синий", "green": "зеленый"}) # Слова red и blue есть в словаре
look({"red": "красный", "green": "зеленый"}) # Слово red есть в словаре, а слово blue отсутствует
look({"blue": "синий", "green": "зеленый"}) # Слово blue есть в словаре, а слово red отсутствует
look({"green": "зеленый"}) # Слова red и blue в словаре отсутствует
look("yelllow") # Это не словарь
Здесь предполагается, что в функцию look передается словарь. Первый шаблон
case {"red": "красный", "blue": "синий"}: # если в словаре words слова red и blue
print("Слова red и blue есть в словаре")
соответствует словарю, в котором есть два элемента со следующими ключами и значениями: "red": "красный" и "blue": "синий".
Второй шаблон ({"red": "красный"}) соответствует любому словарю, где есть элемент "red": "красный". Аналогично третий шаблон ({"blue": "синий"}) соответствует любому словарю, где есть элемент "blue": "синий"
Четвертый шаблон - case {} соответствует в принципе любому словарю.
Последний шаблон соответствует любому значению и применяется на случай, если в функцию передан не словарь.
Передача набора значений
С помощью вертикальной черты | можно определить альтернативные значения:
def look(words):
match words:
case {"red": "красный" | "алый" | "червонный"}: # если значение "красный", "алый" или "червонный"
print("Слово red есть в словаре")
case {}:
print("Слово red в словаре отсутствует или имеет некорректное значение")
look({"red": "красный", "green": "зеленый"}) # Слово red есть в словаре
look({"red": "алый", "green": "зеленый"}) # Слово red есть в словаре
look({"green": "зеленый"}) # Слово red в словаре отсутствует или имеет некорректное значение
В данном случае шаблон {"red": "красный" | "алый" | "червонный"} соответствует словарю, в котором есть элемент с ключом "red" и значением "красный" или "алый" или "червонный".
Также можно задать альтернативный набор словарей:
def look(words):
match words:
case {"red": "красный"} | {"blue": "синий"} :
print("либо red, либо blue есть в словаре")
case {}:
print("надо проверить слова red и blue")
look({"red": "красный", "green": "зеленый"}) # либо red, либо blue есть в словаре
look({"blue": "синий", "green": "зеленый"}) # либо red, либо blue есть в словаре
look({"green": "зеленый"}) # надо проверить слова red и blue
Первый шаблон - {"red": "красный"} | {"blue": "синий"} соответствует словарю, в котором есть либо элемент {"red": "красный"}, или {"blue": "синий"}, или оба.
Если нам важны сами ключи, но не важно значение ключей, то вместо конкретных значений можно передать шаблон _:
def look(words):
match words:
case {"red": _, "blue": _}:
print("Слова red и blue есть в словаре")
case {}:
print("red и/или blue отсутствуют в словаре")
look({"red": "красный", "blue": "синий"}) # Слова red и blue есть в словаре
look({"red": "алый", "blue": "синий"}) # Слова red и blue есть в словаре
look({"red": "красный", "green": "зеленый"}) # red и/или blue отсутствуют в словаре
Получение значений по ключам
Pattern matching позволяет получить значения элементов в переменные в виде:
{ключ: переменная}
Например:
def look(words):
match words:
case {"red": red, "blue": blue}:
print(f"red: {red} blue: {blue}")
case {}:
print("надо проверить слова red и blue")
look({"red": "красный", "blue": "синий"}) # red: красный blue: синий
look({"red": "алый", "blue": "синий"}) # red: алый blue: синий
В первом шаблоне значение элемента с ключом "red" попадает в переменную red, а элемента с ключом "blue" - в переменную blue.
Получение всех значений
С помощью символов ** (двойная звездочка) можно получить остальные элементы словаря:
def look(words):
match words:
case {"red": red, **rest}:
print(f"red: {red}")
for key in rest: # rest - тоже словарь
print(f"{key}: {rest[key]}")
look({"red": "красный", "blue": "синий", "green": "зеленый"})
# red: красный
# blue: синий
# green: зеленый
Здесь шаблон {"red": red, **rest} соответствует любому словарь, в котором есть элемент с ключом "red". Все остальные элементы словаря помещаются в параметр rest, который сам в свою очередь представляет словарь.