MySQL Java JavaScript PHP Python HTML-CSS C-sharp

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.

← Lecția anterioară Lecția următoare →