Cours 1 Ensembles, dictionnaires et annotations

Quentin Lurkin

Ensembles

numbers = {42, -2, 0, 7, 11}

print(numbers)            # {0, 42, 11, -2, 7}
print(len(numbers))       # 5
print(60 in numbers)      # False
print(type(numbers))      # <class 'set'>

for element in numbers:
    print(element)

Définition

# {0, 42, 84, 21, 63}
S = {n for n in range(100) if n % 3 == 0 and n % 7 == 0}

# {0, 42, 12, -1}
A = set([12, 42, 0, 12, 0, -1, 0])

# {'!', 'C', 'i', 'c', 'o', 'r'}
B = set('Cocorico!')

Modification d’un ensemble

S = {1, 2, 3, 4}

S.remove(1)               # {2, 3, 4}
S.remove(2)               # {3, 4}
S.add(5)                  # {3, 4, 5}

Opérations ensemblistes

Trois opérations ensemblistes
A = {1, 2, 3, 4}
B = {3, 4, 5}

print(A - B)              # {1, 2}            (différence)
print(A & B)              # {3, 4}            (intersection)
print(A | B)              # {1, 2, 3, 4, 5}   (union)

Éléments d’un ensemble

# L'ensemble des sous-ensembles de {1, 2, 3}
A = {{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'

Le type frozenset

# L'ensemble des sous-ensembles de {1, 2, 3}
A = {
    frozenset(),
    frozenset({1}), frozenset({2}), frozenset({3}),
    frozenset({1, 2}), frozenset({1, 3}), frozenset({2, 3}),
    frozenset({1, 2, 3})
}

Somme des éléments d’un ensemble

S = {1, 2, 3}

# avec un for
def sumElements(S):
    sum = 0
    for elem in S:
        sum += elem
    return sum

print(sumElements(S))    # 6

# avec la fonction sum
print(sum(S))            # 6

Plus grande valeur d’un ensemble

S = {1, 24, -2, 99, 16}

# avec un for
def maxElement(S):
    max = float("-inf")
    for elem in S:
        if elem > max:
            max = elem
    return max

print(maxElement(S))            # 99

# avec la fonction max
print(max(S))                   # 99

Dictionnaire

phone = {'Quentin': 8723, 'Cédric': 2837, 'Nathalie': 4872}

print(phone)              # {'Quentin': 8723, 'Cédric': 2837,
                          #  'Nathalie': 4872}
print(len(phone))         # 3
print('Cédric' in phone)  # True
print(type(phone))        # <class 'dict'>

Définition

# {1: 1, 3: 9, 9: 81, 5: 25, 7: 49}
square = {n : n ** 2 for n in range(1,10) if n % 2 != 0}

# {'A': 65, 'C': 67, 'B': 66, 'E': 69, 'D': 68, 'F': 70}
mapping = {chr(i): i for i in range(65, 71)}

Accès et modification

price = {"lemon": 0.85, "pear": 1}

price['lemon'] = 0.90     # {"lemon": 0.90, "pear": 1}
price['apple'] = 1.00     # {"lemon": 0.90, "pear": 1, "apple": 1}
del(price['pear'])        # {"lemon": 0.90, "apple": 1}

Parcours d’un dictionnaire

print(list(price.keys()))  # ['lemon', 'pear', 'apple']
print(list(price.items())) # [('lemon', 0.9), ('pear', 1.0), ('apple', 1.0)]
print(list(price.values()))# [0.9, 1.0, 1.0]

# Parcours des clés explicite
for fruit in price.keys():
    print(fruit, price[fruit], sep=' : ')

# Parcours des clés implicite
for fruit in price:
    print(fruit, price[fruit], sep=' : ')

# Parcours des clés et valeurs
for key, value in price.items():
    print(key, value, sep=' : ')

# Parcours des valeurs seulement
for value in price.values():
    print(value)

Collection et recherche

Complexité

À chaque collection son usage

Exemple

# Stockage d'informations d'étudiants avec recherche par matricule efficace
students = {
  "11111": {"firstname": "Peter", "lastname": "Parker"},
  "11112": {"firstname": "Sarah", "lastname": "Connor"},
}

# Stockage d'informations d'étudiants avec importance de l'ordre
students = [
  {"matricule": "11111", "firstname": "Peter", "lastname": "Parker"},
  {"matricule": "11112", "firstname": "Sarah", "lastname": "Connor"},
]

Annotations de type: problème

liste des méthodes disponibles
Aucune aide

Annotations de type

Type inconnu
Avec annotation

Listes

Type des éléments inconnu
Annotation pour les éléments

Tuples

premier élément
deuxième élément
def sum(T: tuple[int, ...]):
  ...

Dictionnaires

def fun(D: dict[str, int]):
  D['un'] = 1
from typing import Hashable, Any

def add_key_value(D: dict, k: Hashable, v: Any):
  D[k] = v

Unions

def sum(x: str | bool):
  ...

Options

from typing import Optional

def sum(x: Optional[int]):
  ...
def sum(x: int | None):
  ...

Types de retour

def sum(L: list[int]) -> int:
  res = 0
  for elem in L:
    res += elem
  return res

Vérification de type

Activer la vérification de types

Documentation

Documentation intégrée

Docstring

Définition du docstring