Aller au contenu
# Dictionnaires : Données Maritimes *L'usage de la calculatrice n'est pas autorisé* *L'utilisation des fonctions `sum`, `max` ou `count` est interdite.* *Durée: 1h*

Gestion de la base de données des bateaux

On va consulter et modifier une base de données qui contient des bateaux sous forme de dictionnaires (chaque bateau correspond à un dictionnaire).

Tous les bateaux sont donc des dictionnaires qui ont pour clés :

Ci-dessous, voici un exemple de bateau.

navire_nordnes = {
    "nom": "NORDNES",
    "type": "Vraquier",  # Type du bateau. Un vraquier transporte des matériaux en vrac (sable, métal,...)
    "capacité": 15000,  # Capacité en tonnes
    "ismm": 258033200,  # Numéro ISMM, un numéro unique.
    "performances": {
        "vitesse_max": 25,  # Vitesse maximale en noeuds
        "consommation_carburant": 120,  # Consommation de carburant en litres par heure
    },
    "pavillon": "Norvège",  # Pavillon du bateau
    }

Question 1

Écrire une instruction qui retourne le numéro ISMM du navire_nordnes.

Corrigé
navire_nordnes["ismm"]

Question 2

Donner une expression qui vaut True si la capacité d'un bateau dont le dictionnaire est appelé B est supérieure à \(10000\) tonnes et False sinon.

Corrigé
B["capacité"] > 10000

Question 3

Le navire décrit par le dictionnaire navire_nordnes vient de passer sous pavillon Suisse. Cependant, cette modification doit être validée uniquement si le nouveau pavillon n'est pas déjà celui du bateau.

Que faut-il écrire pour mettre à jour le pavillon du bateau et afficher un message approprié si le pavillon ne change pas ?

Corrigé
if navire_nordnes["pavillon"] != "Suisse":
  navire_nordnes["pavillon"] = "Suisse"
  print("Le pavillon a été mis à jour.")
else:
  print("Le pavillon est déjà celui du bateau.")

On va à présent condidérer la liste des bateaux qui naviguent sur les mers et océans de la planète. Cette liste s'écrit de la façon suivante: L=[...,petitbateau,navire_nordnes,grosbateau...] et elle contient des milliers de bateaux qui ne peuvent pas être tous décrits ici.

Question 4

Écrire une fonction panama(L) qui retourne la liste des noms des navires sous pavillon du Panama et ayant une vitesse maximale supérieure à 20 noeuds.

Corrigé
def panama(L):
  resultats = []
  for bateau in L:
      if bateau["pavillon"] == "Panama" and bateau["performances"]["vitesse_max"] > 20:
          resultats.append(bateau["nom"])
  return resultats

Question 5

Écrire une fonction serieux(L) qui supprime de la liste les navires du type plaisance.

Corrigé
def serieux(L):
  plais = []
  for bateau in L:
      if bateau["type"] == "plaisance":
          plais.append(bateau)
  for bateau in plais:
    L.remove(bateau)
  return L

Question 6

Écrire une fonction compeche(L) qui retourne le nombre de navires de pêche et la capacité moyenne de ces navires.

Corrigé
def compeche(L):
  nbpeche = 0
  capacite_totale = 0
  for bateau in L:
      if bateau["type"].lower() == "pêche":
          capacite_totale += bateau["capacité"]
          nbpeche += 1
  capacite_moyenne = capacite_totale / nbpeche
  return nombre_peche, capacite_moyenne

Question 7

Écrire une fonction majo(L) qui retourne le type majoritaire parmis les navires.

En cas d'égalité, retourner tous les types en tête sous forme de liste.

Corrigé
def majo(L):
  dicotypes = {}
  for bateau in L:
      type_bateau=bateau["type"]
      if type_bateau in dicotypes:
          dicotypes[type_bateau] += 1
      else:
          dicotypes[type_bateau] = 1

  # on cherche le maximum
  max_type = 0
  for nb in type_bateau.values():
      if nb > max_type:
          max_type = nb

  # on crée la liste des types avec le maximum trouvé avant
  types_majo = []
  for type, nb in type_bateau.items():
      if nb == max_type:
          types_majo.append(type_bateau)

  return types_majo

Question 8

Écrire une fonction speed(L) qui retourne le numéro ISMM du bateau ayant la vitesse maximale la plus grande.

Si plusieurs bateaux ont la même vitesse maximale, choisir celui avec la plus grande capacité.

Corrigé
def speed(L):
  meilleur_bateau = None
  for bateau in L:
      if meilleur_bateau is None or (
          bateau["performances"]["vitesse_max"] > meilleur_bateau["performances"]["vitesse_max"]
      ) or (bateau["performances"]["vitesse_max"] == meilleur_bateau["performances"]["vitesse_max"]
          and bateau["capacité"] > meilleur_bateau["capacité"]):
          meilleur_bateau = bateau
  return meilleur_bateau["ismm"]