Atualizado: 04/11/2024

Dicionários no Pattern Matching - Python

O pattern matching permite verificar a presença de determinadas chaves e valores em um dicionário. Vamos ver um exemplo de como isso pode ser feito:

def look(colors):
    match colors:
        case {"red": "vermelho", "blue": "azul"}:  # se 'colors' contém 'red': 'vermelho' e 'blue': 'azul'
            print("As palavras 'red' e 'blue' estão no dicionário")
        case {"red": "vermelho"}:  # se 'colors' contém 'red': 'vermelho'
            print("A palavra 'red' está no dicionário")
        case {"blue": "azul"}:  # se 'colors' contém 'blue': 'azul'
            print("A palavra 'blue' está no dicionário")
        case dict():  # se 'colors' é um dicionário que não corresponde aos casos anteriores
            print("As palavras não estão no dicionário")
        case _:
            print("A entrada não é um dicionário")


look({"red": "vermelho", "blue": "azul", "green": "verde"})  # As palavras 'red' e 'blue' estão no dicionário
look({"red": "vermelho", "green": "verde"})                  # A palavra 'red' está no dicionário
look({"blue": "azul", "green": "verde"})                     # A palavra 'blue' está no dicionário
look({"green": "verde"})                                      # As palavras não estão no dicionário
look("yellow")                                                # A entrada não é um dicionário

Aqui, supõe-se que um objeto colors do tipo dicionário seja passado para a função look. O pattern matching verifica se o dicionário contém determinadas chaves com valores específicos:

  • Primeiro padrão: { "red": "vermelho", "blue": "azul" } corresponde se ambas as chaves e valores estão presentes.

  • Segundo padrão: { "red": "vermelho" } corresponde se apenas a chave 'red' com o valor 'vermelho' está presente.

  • Terceiro padrão: { "blue": "azul" } corresponde se apenas a chave 'blue' com o valor 'azul' está presente.

  • Quarto padrão: dict() captura qualquer dicionário que não corresponda aos padrões anteriores.

  • Último padrão: _ captura qualquer entrada que não seja um dicionário.

Usando valores alternativos

Podemos definir valores alternativos para uma chave usando o operador | (barra vertical):

def look(colors):
    match colors:
        case {"red": "vermelho" | "escarlate" | "rubro"}:  # se 'red' tem um dos valores especificados
            print("A palavra 'red' está no dicionário com um valor reconhecido")
        case dict():
            print("As palavras não estão no dicionário")
        case _:
            print("A entrada não é um dicionário")

look({"red": "vermelho", "green": "verde"}) # A palavra 'red' está no dicionário com um valor reconhecido
look({"red": "escarlate", "green": "verde"}) # A palavra 'red' está no dicionário com um valor reconhecido
look({"red": "rubro", "green": "verde"}) # A palavra 'red' está no dicionário com um valor reconhecido
look({"green": "verde"}) # As palavras não estão no dicionário
look("yellow") # A entrada não é um dicionário
  • Aqui, o padrão {"red": "vermelho" | "escarlate" | "rubro"} verifica se a chave 'red' possui um dos valores especificados.

  • Caso contrário, se for um dicionário que não corresponda aos padrões anteriores, o padrão dict() será correspondido.

  • Se não for um dicionário, captura com o padrão _ e informa que a entrada não é um dicionário.

Verificando apenas a presença das chaves

Se nos importamos apenas com a presença das chaves, independentemente dos valores, podemos usar o caractere _ como curinga:

def look(colors):
    match colors:
        case {"red": _, "blue": _}:
            print("As palavras 'red' e 'blue' estão no dicionário")
        case {"red": _}:
            print("A palavra 'red' está no dicionário")
        case {"blue": _}:
            print("A palavra 'blue' está no dicionário")
        case dict():
            print("As palavras não estão no dicionário")
        case _:
            print("A entrada não é um dicionário")

look({"red": "vermelho", "blue": "azul", "green": "verde"}) # As palavras 'red' e 'blue' estão no dicionário
look({"red": "vermelho", "green": "verde"}) # A palavra 'red' está no dicionário
look({"blue": "azul", "green": "verde"}) # A palavra 'blue' está no dicionário
look({"green": "verde"}) # As palavras não estão no dicionário
look("yellow") # A entrada não é um dicionário

Aqui, o curinga _ é usado para verificar apenas a presença das chaves, independentemente dos valores associados a elas.

Definindo padrões alternativos para dicionários

Também podemos definir padrões alternativos para estruturas de dicionários:

def look(colors):
    match colors:
        case {"red": _} | {"blue": _}:  # se 'colors' contém a chave 'red' ou 'blue'
            print("A palavra 'red' ou 'blue' está no dicionário")
        case dict():
            print("As palavras não estão no dicionário")
        case _:
            print("A entrada não é um dicionário")

look({"red": "vermelho", "green": "verde"})  # A palavra 'red' ou 'blue' está no dicionário
look({"blue": "azul", "green": "verde"})  # A palavra 'red' ou 'blue' está no dicionário
look({"green": "verde"})  # As palavras não estão no dicionário
look("yellow")  # A entrada não é um dicionário    

Aqui, o padrão {"red": _} | {"blue": _} verifica se a chave 'red' ou 'blue' está presente no dicionário.

Capturando valores associados às chaves

Podemos capturar os valores associados às chaves em variáveis:

def look(colors):
    match colors:
        case {"red": red_value, "blue": blue_value}:
            print(f"Red é {red_value} e Blue é {blue_value}")
        case dict():
            print("As palavras não estão no dicionário")
        case _:
            print("A entrada não é um dicionário")

look({"red": "vermelho", "blue": "azul", "green": "verde"}) # Red é vermelho e Blue é azul
look({"red": "vermelho"}) # As palavras não estão no dicionário

Aqui, os valores associados às chaves 'red' e 'blue' são capturados em variáveis red_value e blue_value, respectivamente.

Obtendo os demais elementos do dicionário

Podemos usar ** para capturar os demais elementos do dicionário:

def look(colors):
    match colors:
        case {"red": red_value, **rest}:
            print(f"Red: {red_value}")
            for key, value in rest.items():
                print(f"{key}: {value}")
        case dict():
            print("As palavras não estão no dicionário")
        case _:
            print("A entrada não é um dicionário")


look({"red": "vermelho", "blue": "azul", "green": "verde"})
# Saída:
# Red: vermelho
# blue: azul
# green: verde

look({"blue": "azul", "green": "verde"})
# Saída:
# As palavras não estão no dicionário

Aqui, o padrão {"red": red_value, **rest} captura o valor associado à chave 'red' em red_value e os demais elementos do dicionário em rest.

Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com