Словари в pattern matching

Последнее обновление: 01.02.2022

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

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850