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"]