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
look
Primeiro padrão:
corresponde se ambas as chaves e valores estão presentes.{ "red": "vermelho", "blue": "azul" }
Segundo padrão:
corresponde se apenas a chave 'red' com o valor 'vermelho' está presente.{ "red": "vermelho" }
Terceiro padrão:
corresponde se apenas a chave 'blue' com o valor 'azul' está presente.{ "blue": "azul" }
Quarto padrão:
captura qualquer dicionário que não corresponda aos padrões anteriores.dict()
Ú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 |
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
verifica se a chave{"red": "vermelho" | "escarlate" | "rubro"}
possui um dos valores especificados.'red'
Caso contrário, se for um dicionário que não corresponda aos padrões anteriores, o padrão
será correspondido.dict()
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 _
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 _
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": _}
'red'
'blue'
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'
'blue'
red_value
blue_value
Obtendo os demais elementos do dicionário
Podemos usar **
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}
'red'
red_value
rest