\documentclass[a4paper,11pt]{article}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[francais,bloc,completemulti]{automultiplechoice}
\usepackage[french]{babel}
\usepackage{amsmath, amssymb}

\title{Dictionnaires}
\date{Numérique et sciences informatiques}

\begin{document}

\noindent\textbf{Dictionnaires} \hfill \textit{Numérique et sciences informatiques}\\[0.4em]
Nom~: \dotfill\ Prénom~: \dotfill

\bigskip

\element{premieredictionnaires}{
  \begin{question}{q01}
    Qu'est-ce qu'un \textbf{dictionnaire} Python ?
    \begin{choices}
    \wrongchoice{Un fichier au format CSV}
    \wrongchoice{Une liste indexée par des entiers}
    \correctchoice{Une structure associant des clés à des valeurs (par exemple un nom à un âge), permettant un accès rapide par clé}
    \wrongchoice{Une simple chaîne de caractères}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q02}
    Comment crée-t-on un dictionnaire
vide en Python ?
    \begin{choices}
    \wrongchoice{Avec la syntaxe \texttt{d = ()}}
    \wrongchoice{Avec la syntaxe \texttt{d = []}}
    \correctchoice{Avec la syntaxe \texttt{d = \{\}}}
    \wrongchoice{Avec la syntaxe \texttt{d = dict[]}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q03}
    Comment accède-t-on à la \textbf{valeur}
associée à la clé \texttt{"nom"} dans le
dictionnaire \texttt{d = \{"nom": "Alice"\}} ?
    \begin{choices}
    \wrongchoice{Avec \texttt{d(nom)}}
    \wrongchoice{Avec \texttt{d.nom}}
    \correctchoice{Avec \texttt{d["nom"]}}
    \wrongchoice{Avec \texttt{d->nom}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q04}
    Comment ajoute-t-on la paire
\texttt{"age": 17} à un dictionnaire \texttt{d}
en Python ?
    \begin{choices}
    \wrongchoice{Avec \texttt{d.append("age", 17)}}
    \wrongchoice{Avec \texttt{d.put("age", 17)}}
    \wrongchoice{Avec \texttt{d.add("age": 17)}}
    \correctchoice{Avec \texttt{d["age"] = 17}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q05}
    Comment connaître le \textbf{nombre de
paires} clé-valeur d'un
dictionnaire ?
    \begin{choices}
    \wrongchoice{Avec \texttt{d.length}}
    \correctchoice{Avec \texttt{len(d)}}
    \wrongchoice{Avec \texttt{d.size()}}
    \wrongchoice{Avec \texttt{count(d)}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q06}
    Que parcourt par défaut la boucle
\texttt{for x in d:}, où \texttt{d} est un
dictionnaire ?
    \begin{choices}
    \wrongchoice{Les paires clé-valeur}
    \correctchoice{Les clés du dictionnaire}
    \wrongchoice{Les valeurs du dictionnaire}
    \wrongchoice{Les indices du dictionnaire}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q07}
    Comment teste-t-on si la clé
\texttt{"nom"} existe dans le
dictionnaire \texttt{d} ?
    \begin{choices}
    \wrongchoice{Avec \texttt{d["nom"]}}
    \wrongchoice{Avec \texttt{d.has("nom")}}
    \wrongchoice{Avec \texttt{d.contains("nom")}}
    \correctchoice{Avec \texttt{"nom" in d}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q08}
    Comment \textbf{supprime-t-on} la clé
\texttt{"age"} d'un dictionnaire \texttt{d} ?
    \begin{choices}
    \wrongchoice{Avec \texttt{d.delete("age")}}
    \wrongchoice{Avec \texttt{d["age"] = None}}
    \wrongchoice{Avec \texttt{d.remove("age")}}
    \correctchoice{Avec \texttt{del d["age"]}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q09}
    Lequel des cas suivants est un
usage \textbf{typique} d'un
dictionnaire ?
    \begin{choices}
    \correctchoice{Associer un identifiant (la clé) à un ensemble d'informations (la valeur), comme un nom à un âge ou un code postal à une ville}
    \wrongchoice{Compresser des données}
    \wrongchoice{Stocker une séquence ordonnée de notes d'élèves}
    \wrongchoice{Trier une liste de valeurs}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q10}
    Que produit ce code ?

\begin{lstlisting}
d = {"a": 1, "b": 2}
d["c"] = 3
print(len(d))
\end{lstlisting}
    \begin{choices}
    \wrongchoice{Il déclenche une erreur}
    \wrongchoice{Il affiche \texttt{"a", "b", "c"}}
    \correctchoice{Il affiche \texttt{3}}
    \wrongchoice{Il affiche \texttt{2}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q11}
    Quel code \textbf{compte} le nombre
d'occurrences de chaque mot dans
une liste \texttt{mots} ?
    \begin{choices}
    \correctchoice{\begin{lstlisting}
c = {}
for m in mots:
    c[m] = c.get(m, 0) + 1
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
c = sum(mots)
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
c = dict(mots)
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
c = mots.count()
\end{lstlisting}
}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q12}
    Que fait \texttt{d.get("x", 0)} ?
    \begin{choices}
    \correctchoice{Elle renvoie la valeur associée à \texttt{"x"} si la clé existe, et $0$ sinon (sans lever d'erreur)}
    \wrongchoice{Elle renvoie toujours la valeur $0$}
    \wrongchoice{Elle supprime la clé \texttt{"x"} du dictionnaire}
    \wrongchoice{Elle déclenche une erreur si la clé n'existe pas}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q13}
    Que renvoie l'appel \texttt{d.items()} ?
    \begin{choices}
    \wrongchoice{Une liste contenant uniquement les clés}
    \wrongchoice{Un ensemble contenant les valeurs}
    \wrongchoice{La taille du dictionnaire}
    \correctchoice{Une vue itérable sur les paires \texttt{(clé, valeur)} du dictionnaire}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q14}
    Lequel des types suivants ne peut
\textbf{pas} être utilisé comme clé de
dictionnaire ?
    \begin{choices}
    \wrongchoice{Le type \texttt{str} (chaîne)}
    \wrongchoice{Le type \texttt{tuple}, à condition que tous ses éléments soient eux-mêmes utilisables comme clés}
    \correctchoice{Le type \texttt{list} (liste)}
    \wrongchoice{Le type \texttt{int} (entier)}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q15}
    Pour rechercher une valeur à
partir d'un identifiant (par
exemple « l'élève dont
l'identifiant est $42$ »),
pourquoi préfère-t-on un
dictionnaire à une liste ?
    \begin{choices}
    \correctchoice{Pour la rapidité d'accès : un accès en $O(1)$ avec un dictionnaire, contre $O(n)$ avec une liste utilisée pour une recherche linéaire}
    \wrongchoice{Parce que les listes ne supportent pas les nombres}
    \wrongchoice{Pour économiser de la mémoire}
    \wrongchoice{Aucune différence notable}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q16}
    Comment représenter une \textbf{table
de traduction} simple du
français vers l'anglais en
Python ?
    \begin{choices}
    \correctchoice{\begin{lstlisting}
{"chat": "cat", "chien": "dog"}
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
("chat", "cat")
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
["chat", "cat", "chien", "dog"]
\end{lstlisting}
}
    \wrongchoice{\begin{lstlisting}
chat = "cat"; chien = "dog"
\end{lstlisting}
}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q17}
    \begin{lstlisting}
d = {"a": 1, "b": 2}
d["a"] = d["a"] + 10
print(d)
\end{lstlisting}
Que produit ce code ?
    \begin{choices}
    \correctchoice{Il affiche \texttt{\{"a": 11, "b": 2\}}}
    \wrongchoice{Il déclenche une erreur}
    \wrongchoice{Il affiche \texttt{\{"a": 1, "b": 2\}}}
    \wrongchoice{Il affiche \texttt{\{"a": 10, "b": 2\}}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q18}
    Que fournit l'instruction
\texttt{from collections import
defaultdict} ?
    \begin{choices}
    \wrongchoice{Elle importe une simple variable}
    \wrongchoice{Elle crée un dictionnaire vide}
    \wrongchoice{Elle importe un fichier annexe}
    \correctchoice{Elle importe un type de dictionnaire qui crée automatiquement une valeur par défaut lorsqu'on accède à une clé inexistante (utile pour les comptages ou les regroupements)}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q19}
    Depuis Python 3.7, dans quel
ordre les entrées d'un
dictionnaire sont-elles
parcourues ?
    \begin{choices}
    \wrongchoice{Dans un ordre aléatoire à chaque exécution}
    \correctchoice{Dans l'ordre d'insertion des paires}
    \wrongchoice{Dans l'ordre alphabétique des clés}
    \wrongchoice{Par taille croissante des valeurs}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q20}
    Que vaut \texttt{bool(\{\})} ?
    \begin{choices}
    \wrongchoice{Une exception}
    \correctchoice{\texttt{False}}
    \wrongchoice{La valeur $0$}
    \wrongchoice{\texttt{True}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q21}
    Pourquoi l'accès à un
dictionnaire est-il en
moyenne en $O(1)$, mais
au pire en $O(n)$ ?
    \begin{choices}
    \wrongchoice{Aucune raison particulière}
    \wrongchoice{Parce que les clés sont triées en interne}
    \correctchoice{Parce que la table de hachage peut subir des collisions (deux clés qui se retrouvent au même emplacement). Au pire (toutes les clés au même emplacement), on retombe sur une recherche linéaire}
    \wrongchoice{Parce que les dictionnaires sont mal conçus en Python}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q22}
    Que fait \texttt{d.setdefault("k",
0)} ?
    \begin{choices}
    \wrongchoice{Elle écrase systématiquement la valeur de la clé \texttt{"k"} avec $0$}
    \wrongchoice{La méthode \texttt{setdefault} n'existe pas en Python}
    \wrongchoice{Elle déclenche systématiquement une erreur}
    \correctchoice{Si la clé \texttt{"k"} existe, elle renvoie sa valeur. Sinon, elle l'ajoute avec la valeur $0$ et renvoie $0$}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q23}
    Pourquoi est-il dangereux de
modifier un dictionnaire
pendant qu'on l'\textbf{itère} ?
    \begin{choices}
    \wrongchoice{Le code s'exécute plus rapidement}
    \wrongchoice{Cette modification est interdite par la loi}
    \wrongchoice{Aucune conséquence particulière}
    \correctchoice{Cela peut lever une exception \texttt{RuntimeError} indiquant que la taille du dictionnaire a changé pendant l'itération, ou produire des comportements imprévisibles}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q24}
    Quel code crée le dictionnaire
\texttt{\{1: 1, 2: 4, 3: 9, ...,
10: 100\}} (le carré de
chaque entier) ?
    \begin{choices}
    \correctchoice{\texttt{\{i: i  2 for i in range(1, 11)\}}}
    \wrongchoice{\texttt{\{i  2 for i in range(1, 11)\}}}
    \wrongchoice{\texttt{[i: i  2 for i in range(1, 11)]}}
    \wrongchoice{\texttt{dict(i, i  2 for i in range(1, 11))}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q25}
    Parmi les affirmations
suivantes sur les
dictionnaires, laquelle est
\textbf{fausse} ?
    \begin{choices}
    \wrongchoice{La méthode \texttt{d.get(k, default)} renvoie \texttt{default} si la clé est absente, sans lever d'erreur}
    \wrongchoice{L'accès par clé est en $O(1)$ en moyenne}
    \correctchoice{Une liste peut être utilisée comme clé d'un dictionnaire}
    \wrongchoice{Depuis Python 3.7, l'ordre d'insertion des paires est conservé lors du parcours}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q26}
    On dispose du dictionnaire suivant :

\begin{lstlisting}
stock = {"stylo": 5, "cahier": 12, "gomme": 3}
\end{lstlisting}

Que renvoie l'expression \texttt{sum(stock.values())} ?
    \begin{choices}
    \wrongchoice{La somme des longueurs des clés (16)}
    \wrongchoice{Une erreur de type}
    \correctchoice{$20$}
    \wrongchoice{$3$}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q27}
    On souhaite, à partir d'un dictionnaire \texttt{d} aux
valeurs distinctes, obtenir un nouveau dictionnaire
où les clés et les valeurs sont échangées. Quelle
compréhension convient ?
    \begin{choices}
    \wrongchoice{\texttt{\{v: k for k in d\}}}
    \wrongchoice{\texttt{\{d[k]: k for k in d.values()\}}}
    \correctchoice{\texttt{\{v: k for k, v in d.items()\}}}
    \wrongchoice{\texttt{\{k: v for v, k in d.items()\}}}
    \end{choices}
  \end{question}
}

\element{premieredictionnaires}{
  \begin{question}{q28}
    Que renvoie l'expression
\texttt{dict([("rouge", 1), ("vert", 2), ("bleu", 3)])} ?
    \begin{choices}
    \correctchoice{\texttt{\{'rouge': 1, 'vert': 2, 'bleu': 3\}}}
    \wrongchoice{\texttt{\{'rouge', 'vert', 'bleu'\}}}
    \wrongchoice{Une erreur de syntaxe}
    \wrongchoice{\texttt{[('rouge', 1), ('vert', 2), ('bleu', 3)]}}
    \end{choices}
  \end{question}
}


\onecopy{1}{
  \shufflegroup{premieredictionnaires}
  \insertgroup{premieredictionnaires}
}

\end{document}
