Найти тему
Удалёнка

Python. Словари в pattern matching

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, который сам в свою очередь представляет словарь.