Dicționare în pattern matching
Pattern matching permite verificarea prezenței anumitor chei și valori într-un dicționar:
def look(words):
match words:
case {"red": "roșu", "blue": "albastru"}: # dacă în dicționarul words există cuvintele red și blue
print("Cuvintele red și blue sunt în dicționar")
case {"red": "roșu"}: # dacă în dicționarul words există cuvântul red
print("Cuvântul red este în dicționar, dar cuvântul blue lipsește")
case {"blue": "albastru"}: # dacă în dicționarul words există cuvântul blue
print("Cuvântul blue este în dicționar, dar cuvântul red lipsește")
case {}:
print("Cuvintele red și blue lipsesc din dicționar")
case _:
print("Acesta nu este un dicționar")
look({"red": "roșu", "blue": "albastru", "green": "verde"}) # Cuvintele red și blue sunt în dicționar
look({"red": "roșu", "green": "verde"}) # Cuvântul red este în dicționar, dar cuvântul blue lipsește
look({"blue": "albastru", "green": "verde"}) # Cuvântul blue este în dicționar, dar cuvântul red lipsește
look({"green": "verde"}) # Cuvintele red și blue lipsesc din dicționar
look("yellow") # Acesta nu este un dicționar
Aici se presupune că funcției look i se transmite un dicționar. Primul șablon:
case {"red": "roșu", "blue": "albastru"}: # dacă în dicționarul words există cuvintele red și blue
print("Cuvintele red și blue sunt în dicționar")
corespunde unui dicționar în care există două elemente cu următoarele chei și valori: "red": "roșu" și "blue": "albastru".
Al doilea șablon ({"red": "roșu"}) corespunde oricărui dicționar în care există elementul "red": "roșu". Similar, al treilea șablon ({"blue": "albastru"}) corespunde oricărui dicționar în care există elementul "blue": "albastru".
Al patrulea șablon - case {} corespunde în principiu oricărui dicționar.
Ultimul șablon corespunde oricărei valori și se aplică în cazul în care funcției i s-a transmis altceva decât un dicționar.
Transmiterea unui set de valori
Cu ajutorul simbolului | poți defini valori alternative:
def look(words):
match words:
case {"red": "roșu" | "stacojiu" | "purpuriu"}: # dacă valoarea este "roșu", "stacojiu" sau "purpuriu"
print("Cuvântul red este în dicționar")
case {}:
print("Cuvântul red lipsește din dicționar sau are o valoare incorectă")
look({"red": "roșu", "green": "verde"}) # Cuvântul red este în dicționar
look({"red": "stacojiu", "green": "verde"}) # Cuvântul red este în dicționar
look({"green": "verde"}) # Cuvântul red lipsește din dicționar sau are o valoare incorectă
În acest caz, șablonul {"red": "roșu" | "stacojiu" | "purpuriu"} corespunde unui dicționar în care există un element cu cheia "red" și valoarea "roșu" sau "stacojiu" sau "purpuriu".
De asemenea, poți defini un set alternativ de dicționare:
def look(words):
match words:
case {"red": "roșu"} | {"blue": "albastru"} :
print("Fie red, fie blue este în dicționar")
case {}:
print("Trebuie să verifici cuvintele red și blue")
look({"red": "roșu", "green": "verde"}) # Fie red, fie blue este în dicționar
look({"blue": "albastru", "green": "verde"}) # Fie red, fie blue este în dicționar
look({"green": "verde"}) # Trebuie să verifici cuvintele red și blue
Primul șablon - {"red": "roșu"} | {"blue": "albastru"} corespunde unui dicționar în care există fie elementul {"red": "roșu"}, fie {"blue": "albastru"}, fie ambele.
Dacă ne interesează doar cheile, nu și valorile lor, atunci în loc de valori specifice putem folosi șablonul _:
def look(words):
match words:
case {"red": _, "blue": _}:
print("Cuvintele red și blue sunt în dicționar")
case {}:
print("red și/sau blue lipsesc din dicționar")
look({"red": "roșu", "blue": "albastru"}) # Cuvintele red și blue sunt în dicționar
look({"red": "stacojiu", "blue": "albastru"}) # Cuvintele red și blue sunt în dicționar
look({"red": "roșu", "green": "verde"}) # red și/sau blue lipsesc din dicționar
Obținerea valorilor după chei
Pattern matching permite obținerea valorilor elementelor în variabile astfel:
{cheie: variabilă}
De exemplu:
def look(words):
match words:
case {"red": red, "blue": blue}:
print(f"red: {red} blue: {blue}")
case {}:
print("Trebuie să verifici cuvintele red și blue")
look({"red": "roșu", "blue": "albastru"}) # red: roșu blue: albastru
look({"red": "stacojiu", "blue": "albastru"}) # red: stacojiu blue: albastru
În primul șablon, valoarea elementului cu cheia "red" ajunge în variabila red, iar valoarea elementului cu cheia "blue" în variabila blue.
Obținerea tuturor valorilor
Cu ajutorul simbolurilor ** (două stele) poți obține restul elementelor din dicționar:
def look(words):
match words:
case {"red": red, **rest}:
print(f"red: {red}")
for key in rest: # rest este și el un dicționar
print(f"{key}: {rest[key]}")
look({"red": "roșu", "blue": "albastru", "green": "verde"})
# red: roșu
# blue: albastru
# green: verde
Aici șablonul {"red": red, **rest} corespunde oricărui dicționar în care există un element cu cheia "red". Toate celelalte elemente ale dicționarului sunt plasate în parametrul rest, care este la rândul său tot un dicționar.