-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathinformation_theory.html
More file actions
595 lines (579 loc) · 51.3 KB
/
information_theory.html
File metadata and controls
595 lines (579 loc) · 51.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>2. Structures de données en Python. Un exemple de la théorie de l’information — Python scientifique - ENS Paris</title>
<link rel="stylesheet" href="_static/nature.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT: '',
VERSION: '2013.4',
COLLAPSE_INDEX: false,
FILE_SUFFIX: '.html',
HAS_SOURCE: true
};
</script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/translations.js"></script>
<link rel="top" title="Python scientifique - ENS Paris" href="index.html" />
<link rel="next" title="3. Systèmes statistiques : Nombres aléatoires - Monte Carlo" href="stochastique.html" />
<link rel="prev" title="1.1.1.1. Préparer la formation: téléchargement d’Anaconda" href="preparation.html" />
</head>
<body>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="stochastique.html" title="3. Systèmes statistiques : Nombres aléatoires - Monte Carlo"
accesskey="N">suivant</a></li>
<li class="right" >
<a href="preparation.html" title="1.1.1.1. Préparer la formation: téléchargement d’Anaconda"
accesskey="P">précédent</a> |</li>
<li><a href="index.html">Python scientifique - ENS Paris</a> »</li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="body">
<div class="section" id="structures-de-donnees-en-python-un-exemple-de-la-theorie-de-l-information">
<h1>2. Structures de données en Python. Un exemple de la théorie de l’information<a class="headerlink" href="#structures-de-donnees-en-python-un-exemple-de-la-theorie-de-l-information" title="Lien permanent vers ce titre">¶</a></h1>
<div class="section" id="modules-et-fichiers">
<h2>2.1. Modules et fichiers<a class="headerlink" href="#modules-et-fichiers" title="Lien permanent vers ce titre">¶</a></h2>
<div class="section" id="modules">
<h3>2.1.1. Modules<a class="headerlink" href="#modules" title="Lien permanent vers ce titre">¶</a></h3>
<p>On peut ranger les définitions de fonctions se rapportant à une même
application au sein d’un script commun baptisé <strong>module</strong></p>
<p>Un module est sauvegardé sous forme d’un fichier dont le nom a la
forme <tt class="docutils literal"><span class="pre"><nom</span> <span class="pre">du</span> <span class="pre">module>.py</span></tt></p>
<p>Pour utiliser un module, il faut se servir de l’instruction</p>
<div class="highlight-python"><pre>import <nom du module></pre>
</div>
<p>L’exécution de cette instruction consiste à exécuter le script
définissant le module (ce script peut contenir des instructions autres
que des définitions de fonctions).</p>
<p>Pour importer un module, Python a besoin de connaître le chemin qui
permet d’accéder au fichier correspondant. Ce chemin doit apparaître
dans la liste des chemins possibles stockés dans la variable <tt class="docutils literal"><span class="pre">path</span></tt> du
module <tt class="docutils literal"><span class="pre">sys</span></tt></p>
<p><strong>Première méthode d’importation</strong></p>
<div class="highlight-python"><div class="highlight"><pre><span class="gp">>>> </span><span class="kn">import</span> <span class="nn">random</span>
<div class="newline"></div><span class="gp">>>> </span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">10</span><span class="p">)</span>
<div class="newline"></div><span class="go">9</span>
<div class="newline"></div></pre></div>
</div>
<ul class="simple">
<li>L’instruction import permet d’importer toutes les fonctions du
module random</li>
<li>Ensuite, nous utilisons la fonction (ou méthode) randint(a,b) du
module random; attention cette fonction renvoie un nombre entier
aléatoirement entre a inclus et b inclus</li>
</ul>
<p><strong>Deuxième méthode d’importation</strong></p>
<p>Pour disposer d’une fonction du module</p>
<div class="highlight-python"><pre>from [module] import [fonction]</pre>
</div>
<p>Pour disposer de toutes les fonctions d’un module</p>
<div class="highlight-python"><pre>from [module] import *</pre>
</div>
<div class="admonition note">
<p class="first admonition-title">Remarque</p>
<p class="last">Cette option est cependant à éviter notament lorsqu’un module propose un nombre important de fonctions et parce que certains modules ont des fonctions qui ont le même nom (par exemple, <tt class="docutils literal"><span class="pre">math</span></tt> et <tt class="docutils literal"><span class="pre">numpy</span></tt>)</p>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="o">*</span>
<div class="newline"></div><span class="n">sept</span> <span class="o">=</span> <span class="n">sqrt</span><span class="p">(</span><span class="mi">49</span><span class="p">)</span>
<div class="newline"></div><span class="n">angle</span> <span class="o">=</span> <span class="n">pi</span><span class="o">/</span><span class="mi">6</span>
<div class="newline"></div><span class="k">print</span> <span class="n">sin</span><span class="p">(</span><span class="n">angle</span><span class="p">)</span>
<div class="newline"></div></pre></div>
</div>
<hr class="docutils" />
<p><strong>Modules courants</strong></p>
<ul class="simple">
<li>sys : passage d’arguments, gestion de l’entrée/sortie standard
etc...</li>
<li>os : dialogue avec le système d’exploitation.</li>
<li>math : fonctions et constantes mathématiques de base (sin, cos, exp,
pi...).</li>
<li>random : génération de nombres aléatoires.</li>
<li>time : permet d’accéder aux fonctions gérant le temps.</li>
<li>urllib : permet de récupérer des données sur internet depuis python.</li>
<li>re : gestion des expressions régulières.</li>
<li>numpy, scipy: modules incontournables du calcul scientifique</li>
<li>Tkinter : interface graphique</li>
<li>...</li>
</ul>
</div>
<div class="section" id="fichiers">
<h3>2.1.2. Fichiers<a class="headerlink" href="#fichiers" title="Lien permanent vers ce titre">¶</a></h3>
<p>Pour permettre une interaction avec l’utilisateur, la méthode la plus simple consiste à employer la fonction <tt class="docutils literal"><span class="pre">raw_input()</span></tt>
:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="s">'Entrez votre prénom : '</span><span class="p">)</span>
<div class="newline"></div><span class="n">prenom</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">()</span>
<div class="newline"></div><span class="k">print</span> <span class="s">'Bonjour,'</span><span class="p">,</span> <span class="n">prenom</span>
<div class="newline"></div></pre></div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="n">prenom</span> <span class="o">=</span> <span class="nb">raw_input</span><span class="p">(</span><span class="s">'Entrez votre prénom : '</span><span class="p">)</span>
<div class="newline"></div><span class="k">print</span> <span class="s">'Bonjour,'</span><span class="p">,</span> <span class="n">prenom</span>
<div class="newline"></div></pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Remarque</p>
<p class="last">La fonction <tt class="docutils literal"><span class="pre">raw_input()</span></tt> renvoie toujours une chaîne de caractères alors que la fonction <tt class="docutils literal"><span class="pre">input()</span></tt> renvoie une valeur dont le type correspond à ce que l’utilisateur a entré`(i.e. une chaîne de caractères doit être entrée avec des guillemets).</p>
</div>
<p>Il est généralement important de dissocier les données des programmes qui les
utilisent en rangeant ces données dans des fichiers séparés.</p>
<p>Le module <tt class="docutils literal"><span class="pre">os</span></tt> contient des fonctions qui permettent de localiser
les fichiers :</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">getcwd()</span></tt> : Retourne le chemin du répertoire courant</li>
<li><tt class="docutils literal"><span class="pre">chdir(<ch>)</span></tt> : Change le répertoire courant qui prend la valeur
donnée par la chaîne <ch></li>
<li><tt class="docutils literal"><span class="pre">path.isfile(<ch>)</span></tt> : Retourne un booléen qui indique s’il existe
un fichier de chemin <ch></li>
<li><tt class="docutils literal"><span class="pre">path.isdir(<ch>)</span></tt> : Retourne un booléen qui indique s’il existe
un répertoire de chemin <ch></li>
</ul>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">os</span> <span class="kn">import</span> <span class="n">chdir</span>
<div class="newline"></div><span class="n">chdir</span><span class="p">(</span><span class="s">"/home/exercices"</span><span class="p">)</span>
<div class="newline"></div></pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Remarque</p>
<p class="last">En mode interactif, iPython reconnaît les commandes consoles traditionnelles (ls, cd, pwd, ...)</p>
</div>
<p>Pour utiliser un fichier identifié par le chemin <ch> dans un
programme Python, il faut commencer par l’ouvrir par l’appel de
fonction</p>
<div class="highlight-python"><pre>open(<ch>, [<mode>])</pre>
</div>
<p>qui retourne un objet de type file.</p>
<p>Le paramètre facultatif <tt class="docutils literal"><span class="pre"><mode></span></tt> indique le mode d’ouverture du
fichier :</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">r</span></tt> : mode lecture (le fichier doit exister préalablement)</li>
<li><tt class="docutils literal"><span class="pre">w</span></tt> : mode écriture (si le fichier existe, les données sont
écrasées, sinon le fichier est créé)</li>
<li><tt class="docutils literal"><span class="pre">a</span></tt> : mode ajout (si le fichier existe, les données écrites vont
l’être après celles existantes, sinon le fichier est créé)</li>
</ul>
<p>Si le mode est omis, le mode par défaut est <tt class="docutils literal"><span class="pre">r</span></tt>.</p>
<p>Un objet de type <tt class="docutils literal"><span class="pre">file</span></tt> est associé à des attributs et des
méthodes. En voici quelques-unes :</p>
<ul class="simple">
<li><tt class="docutils literal"><span class="pre">read([<n>])</span></tt> : retourne la chaîne des <n> caractères restants</li>
<li><tt class="docutils literal"><span class="pre">readline()</span></tt> : lit une seule ligne à partir du fichier</li>
<li><tt class="docutils literal"><span class="pre">readlines()</span></tt> : utilise f.readline() de façon répétitive, et
retourne une liste contenant toutes les lignes du fichier.</li>
<li><tt class="docutils literal"><span class="pre">write(<ch>)</span></tt> : écrit la chaîne de caractères <ch></li>
<li><tt class="docutils literal"><span class="pre">close()</span></tt> : ferme le fichier</li>
<li><tt class="docutils literal"><span class="pre">seek(<n>)</span></tt> : choisit le caractère <n> comme position courante du
fichier</li>
<li><tt class="docutils literal"><span class="pre">tell()</span></tt> : retourne le caractère en position courante</li>
</ul>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># Exemple de copie intégrale d'un fichier</span>
<div class="newline"></div><span class="n">fs</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">"source.txt"</span><span class="p">,</span> <span class="s">'r'</span><span class="p">)</span>
<div class="newline"></div><span class="n">fd</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">"destination.txt"</span><span class="p">,</span> <span class="s">'w'</span><span class="p">)</span>
<div class="newline"></div><span class="k">while</span> <span class="mi">1</span><span class="p">:</span>
<div class="newline"></div> <span class="n">txt</span> <span class="o">=</span> <span class="n">fs</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">50</span><span class="p">)</span> <span class="c"># copie de 50 caractères à la fois</span>
<div class="newline"></div> <span class="k">if</span> <span class="n">txt</span> <span class="o">==</span> <span class="s">""</span><span class="p">:</span>
<div class="newline"></div> <span class="k">break</span>
<div class="newline"></div> <span class="n">fd</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">txt</span><span class="p">)</span>
<div class="newline"></div><span class="n">fs</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<div class="newline"></div><span class="n">fd</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<div class="newline"></div></pre></div>
</div>
<div class="admonition note">
<p class="first admonition-title">Remarque</p>
<p class="last">Python fournit le module standard <em>pickle</em> qui peut prendre (presque) n’importe quel objet Python et le convertir en une représentation sous forme de chaîne de caractères (et le reconstruire). Il s’agit du moyen standard pour enregistrer des objets Python et les réutiliser dans d’autres programmes.</p>
</div>
</div>
</div>
<div class="section" id="structures-de-donnees-en-python">
<h2>2.2. Structures de données en Python<a class="headerlink" href="#structures-de-donnees-en-python" title="Lien permanent vers ce titre">¶</a></h2>
<div class="section" id="utilisation-avancee-des-listes">
<h3>2.2.1. Utilisation avancée des listes<a class="headerlink" href="#utilisation-avancee-des-listes" title="Lien permanent vers ce titre">¶</a></h3>
<p><strong>Les fonctions héritées du fonctionnel.</strong>
La fonction <tt class="docutils literal"><span class="pre">map</span></tt> permet de transformer une liste via l’utilisation
d’une fonction. Elle prend en entrée une fonction et une liste et
retourne une nouvelle liste en appelant la fonction sur chaque élément
de la liste dans l’ordre. Voici quelques exemples d’utilisation :</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">carre</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<div class="newline"></div> <span class="k">return</span> <span class="n">x</span> <span class="o">**</span> <span class="mi">2</span>
<div class="newline"></div><span class="k">def</span> <span class="nf">pair</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<div class="newline"></div> <span class="k">return</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">x</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span>
<div class="newline"></div>
<div class="newline"></div><span class="k">print</span> <span class="nb">map</span><span class="p">(</span><span class="n">carre</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<div class="newline"></div><span class="c"># Affiche [1, 4, 9, 16, 25]</span>
<div class="newline"></div>
<div class="newline"></div><span class="k">print</span> <span class="nb">map</span><span class="p">(</span><span class="n">pair</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<div class="newline"></div><span class="c"># Affiche [False, True, False, True, False]</span>
<div class="newline"></div></pre></div>
</div>
<p>Comme dans les langages fonctionnels, avec le mot-clé <tt class="docutils literal"><span class="pre">lambda</span></tt>, il
est possible de créer des fonctions anonymes. Le premier exemple est
équivalent à</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span> <span class="nb">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">**</span><span class="mi">2</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<div class="newline"></div><span class="c"># Affiche [1, 4, 9, 16, 25]</span>
<div class="newline"></div></pre></div>
</div>
<p>La fonction <strong>filter</strong> permet de retirer les valeurs d’une liste que
l’on ne veut pas. Elle prend en entrée une fonction et une liste et
retourne la liste des éléments (dans l’ordre) sur lesquels la fonction
retourne le booléen <tt class="docutils literal"><span class="pre">True</span></tt>.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">petit_carre</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<div class="newline"></div> <span class="k">return</span> <span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="o"><</span> <span class="mi">16</span>
<div class="newline"></div><span class="k">def</span> <span class="nf">pair</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
<div class="newline"></div> <span class="k">return</span> <span class="ow">not</span> <span class="nb">bool</span><span class="p">(</span><span class="n">x</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)</span>
<div class="newline"></div>
<div class="newline"></div><span class="k">print</span> <span class="nb">filter</span><span class="p">(</span><span class="n">petit_carre</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<div class="newline"></div><span class="c"># Affiche [1, 2, 3]</span>
<div class="newline"></div>
<div class="newline"></div><span class="k">print</span> <span class="nb">filter</span><span class="p">(</span><span class="n">pair</span><span class="p">,</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">])</span>
<div class="newline"></div><span class="c"># Affiche [2, 4], c'est à dire les nombres pairs de la liste.</span>
<div class="newline"></div></pre></div>
</div>
<p><strong>Les compréhensions de liste.</strong>
Les compréhensions de liste sont des outils puissants permettant
d’utiliser map et filter avec une syntaxe plus proche de celle
habituelle en Python. De plus, elles permettent de combiner un <tt class="docutils literal"><span class="pre">map</span></tt> et
un <tt class="docutils literal"><span class="pre">filter</span></tt> en même temps.</p>
<p>Voici la syntaxe avec les exemples vus précédemment</p>
<div class="highlight-python"><div class="highlight"><pre><span class="c"># Affiche les carrés des éléments</span>
<div class="newline"></div><span class="n">liste</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">]</span>
<div class="newline"></div><span class="k">print</span> <span class="p">[</span><span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">liste</span><span class="p">]</span>
<div class="newline"></div><span class="c"># Équivaut au map, en plus lisible et plus simple :) .</span>
<div class="newline"></div>
<div class="newline"></div><span class="c"># Affiche les nombres pairs</span>
<div class="newline"></div><span class="k">print</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">liste</span> <span class="k">if</span> <span class="n">x</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
<div class="newline"></div><span class="c"># Plus simple que filter, également :)</span>
<div class="newline"></div>
<div class="newline"></div><span class="c"># Affiche les carrés pairs (combinaison des deux)</span>
<div class="newline"></div><span class="k">print</span> <span class="p">[</span><span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">liste</span> <span class="k">if</span> <span class="n">x</span> <span class="o">**</span> <span class="mi">2</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">]</span>
<div class="newline"></div><span class="c"># ou print [x for x in [a ** 2 for a in liste] if x % 2 == 0]</span>
<div class="newline"></div></pre></div>
</div>
<p><strong>Méthodes supplémentaires sur les listes</strong></p>
<p>Voici une liste des méthodes des objets de type liste les plus utiles :</p>
<blockquote>
<div><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.append(x)</span></tt>:</th><td class="field-body"><p class="first">Ajoute l’élément x à la fin de la liste L</p>
</td>
</tr>
<tr class="field-even field"><th class="field-name"><tt class="docutils literal"><span class="pre">L1.extend(L2)</span></tt>:</th><td class="field-body"><p class="first">Étend la liste L1 en y ajoutant tous les éléments de la liste L2</p>
</td>
</tr>
<tr class="field-odd field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.insert(i,</span> <span class="pre">x)</span></tt>:</th><td class="field-body"><p class="first">Insère l’élément x dans la liste L à la position i</p>
</td>
</tr>
<tr class="field-even field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.remove(x)</span></tt>:</th><td class="field-body"><p class="first">Supprime de la liste L le premier élément dont la valeur est x.</p>
</td>
</tr>
<tr class="field-odd field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.pop([i])</span></tt>:</th><td class="field-body"><p class="first">Enlève de la liste L l’élément situé à la position i</p>
<p>Si aucune position n’est indiqué, L.pop() enlève et retourne le dernier élément de la liste</p>
</td>
</tr>
<tr class="field-even field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.index(x)</span></tt>:</th><td class="field-body"><p class="first">Retourne la position du premier élément de la liste L ayant la valeur x.</p>
</td>
</tr>
<tr class="field-odd field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.sort()</span></tt>:</th><td class="field-body"><p class="first">Trie les éléments de la liste, en place.</p>
</td>
</tr>
<tr class="field-even field"><th class="field-name"><tt class="docutils literal"><span class="pre">L.reverse()</span></tt>:</th><td class="field-body"><p class="first last">Inverse l’ordre des éléments de la liste, en place.</p>
</td>
</tr>
</tbody>
</table>
</div></blockquote>
<div class="admonition note">
<p class="first admonition-title">Remarque</p>
<p class="last">Ces méthodes permettent d’utiliser les listes comme des piles (i.e. une structure de donnée “dernier entré, premier sorti” ou LIFO) L’ajout d’un élément sur la pile se fait avec la méthode <tt class="docutils literal"><span class="pre">append()</span></tt> et la méthode <tt class="docutils literal"><span class="pre">pop()</span></tt> permet de récupérer l’objet au sommet de la pile. Cependant, les listes ne sont pas adaptées pour implanter des files (i.e. une structure de donnée “dernier entré, dernier sorti” ou FIFO) pour lesquelles il vaut mieux utiliser la classe <tt class="docutils literal"><span class="pre">collections.deque</span></tt>.</p>
</div>
</div>
<div class="section" id="un-exemple-de-structures-de-donnee-complexe-le-tas">
<h3>2.2.2. Un exemple de structures de donnée complexe : Le tas<a class="headerlink" href="#un-exemple-de-structures-de-donnee-complexe-le-tas" title="Lien permanent vers ce titre">¶</a></h3>
<p><strong>Tas binaire.</strong> Un tas binaire (en anglais, heap) est une structure de données qui :</p>
<ul class="simple">
<li>est un arbre binaire</li>
<li>est ordonné de sorte que la clé d’un nœud est toujours inférieure à la clé de ses fils (de sorte que son plus petit élément est toujours la racine de l’arbre).</li>
</ul>
<p>Les tas binaires supportent les opérations suivantes :</p>
<ul class="simple">
<li>Construire-Tas</li>
<li>Ajouter-Élément</li>
<li>Consulter-Sommet</li>
<li>Retirer-Élément</li>
<li>Tamiser (refabriquer le tas pour qu’il retrouve ses propriétés; par exemple suite à l’ajout ou la suppression d’un élément)</li>
</ul>
<p>Les tas permettent notamment d’implanter les <strong>files de priorité</strong> qui permettent d’effectuer les trois opérations suivantes :</p>
<ul class="simple">
<li>insérer un élément</li>
<li>lire puis supprimer l’élément ayant la plus grande clé</li>
<li>tester si la file de priorité est vide ou pas</li>
</ul>
<p><strong>Module heapq</strong>. Ce module propose une implantation efficace des tas binaires (et des files de priorité) qui utilise naturellement des tableaux.</p>
<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">heapq</span>
<div class="newline"></div></pre></div>
</div>
<p>Les fonctions suivantes sont notamment définies :</p>
<blockquote>
<div><table class="docutils field-list" frame="void" rules="none">
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field-odd field"><th class="field-name" colspan="2"><tt class="docutils literal"><span class="pre">heapq.heappush(T,</span> <span class="pre">x)</span></tt>:</th></tr>
<tr class="field-odd field"><td> </td><td class="field-body">Ajoute la valeur x au tas T (en conservant la propriété de tas)</td>
</tr>
<tr class="field-even field"><th class="field-name" colspan="2"><tt class="docutils literal"><span class="pre">heapq.heappop(T)</span></tt>:</th></tr>
<tr class="field-even field"><td> </td><td class="field-body">Enlève et retourne le premier élément du tas T</td>
</tr>
<tr class="field-odd field"><th class="field-name" colspan="2"><tt class="docutils literal"><span class="pre">heapq.heapify(L)</span></tt>:</th></tr>
<tr class="field-odd field"><td> </td><td class="field-body">Transforme la liste L en un tas (en place et en temps linéaire)</td>
</tr>
</tbody>
</table>
</div></blockquote>
<div class="admonition note">
<p class="first admonition-title">Remarque</p>
<p class="last">En pratique, puisque un tas est un arbre binaire, l’implantation utilise des tableaux unidimensionel de sorte que <tt class="docutils literal"><span class="pre">tas[k]</span> <span class="pre"><=</span> <span class="pre">tas[2*k+1]</span></tt> et <tt class="docutils literal"><span class="pre">tas[k]</span> <span class="pre"><=</span> <span class="pre">tas[2*k]</span></tt> pour tout <tt class="docutils literal"><span class="pre">k</span></tt>. En particulier le père d’un noeud en position <tt class="docutils literal"><span class="pre">k</span></tt> a pour position <tt class="docutils literal"><span class="pre">(k-1)/2</span></tt> et les fils d’un noeud en position <tt class="docutils literal"><span class="pre">k</span></tt> sont situés aux positions <tt class="docutils literal"><span class="pre">2*k</span></tt> et <tt class="docutils literal"><span class="pre">2*k+1</span></tt>.</p>
</div>
<div class="highlight-python"><pre>In [1]: from heapq import *
In [2]: L = [7,4,8,1,9,3,2,6,5]
In [3]: heapify(L)
In [4]: L
Out[4]: [1, 4, 2, 5, 9, 3, 8, 6, 7]</pre>
</div>
<div class="figure">
<img alt="_images/Heap.png" src="_images/Heap.png" />
</div>
</div>
</div>
<div class="section" id="codage-de-huffman">
<h2>2.3. Codage de Huffman<a class="headerlink" href="#codage-de-huffman" title="Lien permanent vers ce titre">¶</a></h2>
<div class="section" id="principe">
<h3>2.3.1. Principe<a class="headerlink" href="#principe" title="Lien permanent vers ce titre">¶</a></h3>
<p>Le <strong>codage de Huffman</strong> est une méthode de compression de données
sans perte proposé par David Huffman en 1952. Elle consiste à
attribuer un mot binaire de longueur variable aux différents symboles
du document à compresser (pixels ou caractères par exemple). Les
symboles les plus fréquents sont codés avec des mots courts, tandis
que les symboles les plus rares sont encodés avec des mots plus longs
(rappelant ainsi le principe de l’alphabet Morse). Le code construit a
la particularité de ne posséder aucun mot ayant pour préfixe un autre
mot (i.e. il s’agit d’un code préfixe).</p>
<p>Le codage de Huffman crée un arbre binaire à partir de tous les
symboles et de leur nombre d’occurrences dans le document :</p>
<ul class="simple">
<li>chaque caractère constitue une des feuilles de l’arbre à laquelle on
associe un poids valant son nombre d’occurrences</li>
<li>l’arbre est créé récursivement en associant à chaque étape les deux nœuds de plus faibles poids pour donner un nœud dont le poids est égal à la somme des poids de ses fils jusqu’à n’en avoir plus qu’un, la racine.</li>
</ul>
<p>L’utilisation d’un tas pour construire cet arbre est donc particulièrement appropriée.</p>
<p>On associe ensuite le code 0 à la branche de gauche et le code 1 à la
branche de droite et le code binaire de chaque symbole est alors
obtenu en parcourant la racine jusqu’à la feuille et en notant le
parcours (0 ou 1) à chaque noeud.</p>
<p>Un arbre d’Huffman associé au texte “PROGRAMMATION EN LANGAGE PYTHON”
est donné sur la figure suivante :</p>
<div class="figure">
<img alt="_images/HuffmanTree.png" src="_images/HuffmanTree.png" />
</div>
<p>La lettre “A” avec 4 occurrences est codée par le triplet 011 alors
que la lettre Y plus rare est codée par le mot de 5 bits 01001.</p>
</div>
<div class="section" id="implantation-du-codage-de-huffman-en-python">
<h3>2.3.2. Implantation du codage de Huffman en Python<a class="headerlink" href="#implantation-du-codage-de-huffman-en-python" title="Lien permanent vers ce titre">¶</a></h3>
<p><strong>Table des occurrences.</strong> La première étape de la méthode de compression de Huffman consiste à compter le nombre d’occurrences de chaque symbole.</p>
<div class="green topic">
<p class="topic-title first"><strong>Exercice</strong>: Construire une table des occurrences</p>
<p>Écrire une fonction <tt class="docutils literal"><span class="pre">table_frequences</span></tt> qui étant donné une chaîne de caractère <tt class="docutils literal"><span class="pre">texte</span></tt> retourne un dictionnaire qui associe à chaque caractère son nombre d’occurrences dans <tt class="docutils literal"><span class="pre">texte</span></tt>.</p>
<p>Le prototype de la fonction sera le suivant</p>
<div class="highlight-python"><pre>def table_frequences(texte):</pre>
</div>
<p>et</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">table_frequences</span><span class="p">(</span><span class="s">"ABRACADABRA"</span><span class="p">)</span>
<div class="newline"></div></pre></div>
</div>
<p>devra retourner un dictionnaire de la forme</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">{</span><span class="s">'A'</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s">'R'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'B'</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="s">'C'</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s">'D'</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>
<div class="newline"></div></pre></div>
</div>
</div>
<div class="topic">
<p class="topic-title first"><strong>Solution</strong>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">table_frequences</span><span class="p">(</span><span class="n">texte</span><span class="p">):</span>
<div class="newline"></div> <span class="n">table</span> <span class="o">=</span> <span class="p">{}</span>
<div class="newline"></div> <span class="k">for</span> <span class="n">caractere</span> <span class="ow">in</span> <span class="n">texte</span><span class="p">:</span>
<div class="newline"></div> <span class="k">if</span> <span class="n">caractere</span> <span class="ow">in</span> <span class="n">table</span><span class="p">:</span>
<div class="newline"></div> <span class="n">table</span><span class="p">[</span><span class="n">caractere</span><span class="p">]</span> <span class="o">=</span> <span class="n">table</span><span class="p">[</span><span class="n">caractere</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span>
<div class="newline"></div> <span class="k">else</span><span class="p">:</span>
<div class="newline"></div> <span class="n">table</span><span class="p">[</span><span class="n">caractere</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<div class="newline"></div> <span class="k">return</span> <span class="n">table</span>
<div class="newline"></div></pre></div>
</div>
</div>
<p><strong>Arbre de Huffman.</strong> Une approche naturelle pour construire l’arbre de Huffman à partir de la table des occurrences consiste à utiliser un tas binaire.</p>
<p>Dans un premier temps, on peut construire un tas correspondant à la table des occurrences (qui aura donc le caractère le moins fréquent à la racine). Ensuite, il faut utiliser cette structure pour construire récursivement l’arbre binaire :</p>
<ul class="simple">
<li>en recherchant les deux noeuds de plus petit poids (en utilisant la structure de tas)</li>
<li>en fusionnant ces deux noeuds en un seul :<ul>
<li>dont le poids est égal à la somme des poids des deux noeuds</li>
<li>qui a ces deux noeuds comme fils</li>
</ul>
</li>
</ul>
<p>Une représentation possible pour le noeud ainsi construit est d’utiliser un dictionnaire à deux clés (par exemple 0 pour gauche et 1 pour droite) dont les valeurs sont les représentations des noeuds initiaux.</p>
<div class="green topic">
<p class="topic-title first"><strong>Exercice</strong>: Construire un arbre de Huffman</p>
<p>Écrire une fonction <tt class="docutils literal"><span class="pre">arbre_huffman</span></tt> qui étant donné un dictionnaire construit par la fonction précédente retourne une représentation de l’arbre de Huffman correspondant.</p>
<p>Le prototype de la fonction sera le suivant</p>
<div class="highlight-python"><pre>def arbre_huffman (occurrences):</pre>
</div>
<p>et l’appel de</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">arbre_huffman</span><span class="p">(</span><span class="n">table_frequences</span><span class="p">(</span><span class="s">"ABRACADABRA"</span><span class="p">))</span>
<div class="newline"></div></pre></div>
</div>
<p>devra retourner un dictionnaire de la forme</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s">'A'</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s">'R'</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="s">'C'</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="s">'D'</span><span class="p">},</span> <span class="mi">1</span><span class="p">:</span> <span class="s">'B'</span><span class="p">}}}</span>
<div class="newline"></div></pre></div>
</div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">arbre_huffman</span><span class="p">(</span><span class="n">occurrences</span><span class="p">):</span>
<div class="newline"></div> <span class="c"># Construction d'un tas avec les lettres sous forme de feuilles</span>
<div class="newline"></div> <span class="n">tas</span> <span class="o">=</span> <span class="p">[(</span><span class="n">occ</span><span class="p">,</span> <span class="n">lettre</span><span class="p">)</span> <span class="k">for</span> <span class="p">(</span><span class="n">lettre</span><span class="p">,</span> <span class="n">occ</span><span class="p">)</span> <span class="ow">in</span> <span class="n">occurrences</span><span class="o">.</span><span class="n">items</span><span class="p">()]</span>
<div class="newline"></div> <span class="n">heapify</span><span class="p">(</span><span class="n">tas</span><span class="p">)</span>
<div class="newline"></div>
<div class="newline"></div> <span class="c"># Création de l'arbre</span>
<div class="newline"></div> <span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">tas</span><span class="p">)</span> <span class="o">>=</span> <span class="mi">2</span><span class="p">:</span>
<div class="newline"></div> <span class="n">occ1</span><span class="p">,</span> <span class="n">noeud1</span> <span class="o">=</span> <span class="n">heappop</span><span class="p">(</span><span class="n">tas</span><span class="p">)</span> <span class="c"># noeud de plus petit poids occ1</span>
<div class="newline"></div> <span class="n">occ2</span><span class="p">,</span> <span class="n">noeud2</span> <span class="o">=</span> <span class="n">heappop</span><span class="p">(</span><span class="n">tas</span><span class="p">)</span> <span class="c"># noeud de deuxième plus petit poids occ2</span>
<div class="newline"></div> <span class="n">heappush</span><span class="p">(</span><span class="n">tas</span><span class="p">,</span> <span class="p">(</span><span class="n">occ1</span> <span class="o">+</span> <span class="n">occ2</span><span class="p">,</span> <span class="p">{</span><span class="mi">0</span><span class="p">:</span> <span class="n">noeud1</span><span class="p">,</span> <span class="mi">1</span><span class="p">:</span> <span class="n">noeud2</span><span class="p">}))</span>
<div class="newline"></div> <span class="c"># ajoute au tas le noeud de poids occ1+occ2 et avec les fils noeud1 et noeud2</span>
<div class="newline"></div>
<div class="newline"></div> <span class="k">return</span> <span class="n">heappop</span><span class="p">(</span><span class="n">tas</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span>
<div class="newline"></div></pre></div>
</div>
<p><strong>Code de Huffman</strong></p>
<div class="green topic">
<p class="topic-title first"><strong>Exercice</strong>: Code de Huffman</p>
<p>Écrire une fonction <tt class="docutils literal"><span class="pre">code_huffman</span></tt> qui étant donné un arbre de Huffman construit par la fonction précédente retourne un dictionnaire où les clés sont les chaînes binaires et les valeurs les caractères correspondants.</p>
<p>Le prototype de la fonction sera le suivant</p>
<div class="highlight-python"><pre>def code_huffman(arbre):</pre>
</div>
<p>et l’appel de</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">C</span> <span class="o">=</span> <span class="n">code_huffman</span><span class="p">(</span><span class="n">T</span><span class="p">)</span>
<div class="newline"></div><span class="k">print</span> <span class="n">T</span>
<div class="newline"></div></pre></div>
</div>
<p>avec T l’arbre précédent, devra retourner un dictionnaire de la forme suivante</p>
<div class="highlight-python"><div class="highlight"><pre><span class="p">{</span><span class="s">'10'</span><span class="p">:</span> <span class="s">'R'</span><span class="p">,</span> <span class="s">'111'</span><span class="p">:</span> <span class="s">'B'</span><span class="p">,</span> <span class="s">'0'</span><span class="p">:</span> <span class="s">'A'</span><span class="p">,</span> <span class="s">'1100'</span><span class="p">:</span> <span class="s">'C'</span><span class="p">,</span> <span class="s">'1101'</span><span class="p">:</span> <span class="s">'D'</span><span class="p">}</span>
<div class="newline"></div></pre></div>
</div>
</div>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">code_huffman_parcours</span><span class="p">(</span><span class="n">arbre</span><span class="p">,</span><span class="n">prefixe</span><span class="p">,</span><span class="n">code</span><span class="p">):</span>
<div class="newline"></div> <span class="k">for</span> <span class="n">noeud</span> <span class="ow">in</span> <span class="n">arbre</span><span class="p">:</span>
<div class="newline"></div> <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">arbre</span><span class="p">[</span><span class="n">noeud</span><span class="p">])</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<div class="newline"></div> <span class="n">code</span><span class="p">[</span><span class="n">prefixe</span><span class="o">+</span><span class="n">noeud</span><span class="p">]</span> <span class="o">=</span> <span class="n">arbre</span><span class="p">[</span><span class="n">noeud</span><span class="p">]</span>
<div class="newline"></div> <span class="k">else</span><span class="p">:</span>
<div class="newline"></div> <span class="n">code_huffman_parcours</span><span class="p">(</span><span class="n">arbre</span><span class="p">[</span><span class="n">noeud</span><span class="p">],</span><span class="n">prefixe</span><span class="o">+</span><span class="n">noeud</span><span class="p">,</span><span class="n">code</span><span class="p">)</span>
<div class="newline"></div>
<div class="newline"></div><span class="k">def</span> <span class="nf">code_huffman</span><span class="p">(</span><span class="n">arbre</span><span class="p">):</span>
<div class="newline"></div> <span class="n">code</span> <span class="o">=</span> <span class="p">{}</span>
<div class="newline"></div> <span class="n">code_huffman_parcours</span><span class="p">(</span><span class="n">arbre</span><span class="p">,</span><span class="s">''</span><span class="p">,</span><span class="n">code</span><span class="p">)</span>
<div class="newline"></div> <span class="k">return</span> <span class="n">code</span>
<div class="newline"></div></pre></div>
</div>
<p><strong>Encodage et décodage</strong></p>
<div class="green topic">
<p class="topic-title first"><strong>Exercice</strong>: Encodage</p>
<p>Écrire une fonction <tt class="docutils literal"><span class="pre">encodage</span></tt> qui étant donné un code de Huffman construit par la fonction précédente et le texte initial retourne la chaîne de bits produite par le codage de Huffman.</p>
<p>Le prototype de la fonction sera le suivant</p>
<div class="highlight-python"><pre>def encodage(code,texte):</pre>
</div>
<p>et l’appel de</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">encodage</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="s">"ABRACADABRA"</span><span class="p">)</span>
<div class="newline"></div></pre></div>
</div>
<p>avec C le code précédent, devra retourner la chaîne binaire suivante</p>
<div class="highlight-python"><div class="highlight"><pre><span class="s">"01111001100011010111100"</span>
<div class="newline"></div></pre></div>
</div>
</div>
<div class="topic">
<p class="topic-title first"><strong>Solution</strong>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">encodage</span><span class="p">(</span><span class="n">texte</span><span class="p">,</span><span class="n">code</span><span class="p">):</span>
<div class="newline"></div> <span class="n">code_inv</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">((</span><span class="n">code</span><span class="p">[</span><span class="n">bits</span><span class="p">],</span> <span class="n">bits</span><span class="p">)</span> <span class="k">for</span> <span class="n">bits</span> <span class="ow">in</span> <span class="n">code</span><span class="p">)</span>
<div class="newline"></div> <span class="c"># construit le dictionnaire inverse</span>
<div class="newline"></div> <span class="n">texte_binaire</span> <span class="o">=</span> <span class="s">''</span>
<div class="newline"></div> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">texte</span><span class="p">:</span>
<div class="newline"></div> <span class="n">texte_binaire</span> <span class="o">=</span> <span class="n">texte_binaire</span> <span class="o">+</span> <span class="n">code_inv</span><span class="p">[</span><span class="n">c</span><span class="p">]</span>
<div class="newline"></div> <span class="k">return</span> <span class="n">texte_binaire</span>
<div class="newline"></div></pre></div>
</div>
</div>
<div class="green topic">
<p class="topic-title first"><strong>Exercice</strong>: Décodage</p>
<p>Écrire une fonction <tt class="docutils literal"><span class="pre">decodage</span></tt> qui étant donnés un code de Huffman et un texte binaire compressé retourne le texte initial.</p>
<p>Le prototype de la fonction sera le suivant</p>
<div class="highlight-python"><pre>def decodage(code,texte_binaire):</pre>
</div>
<p>et l’appel de</p>
<div class="highlight-python"><div class="highlight"><pre><span class="n">encodage</span><span class="p">(</span><span class="n">T</span><span class="p">,</span><span class="s">"01111001100011010111100"</span><span class="p">)</span>
<div class="newline"></div></pre></div>
</div>
<p>avec C le code précédent, devra retourner la chaîne binaire suivante</p>
<div class="highlight-python"><div class="highlight"><pre><span class="s">"ABRACADABRA"</span>
<div class="newline"></div></pre></div>
</div>
</div>
<div class="topic">
<p class="topic-title first"><strong>Solution</strong>:</p>
<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">decodage</span><span class="p">(</span><span class="n">code</span><span class="p">,</span><span class="n">texte_binaire</span><span class="p">):</span>
<div class="newline"></div> <span class="n">texte</span> <span class="o">=</span> <span class="s">''</span>
<div class="newline"></div> <span class="n">tampon</span> <span class="o">=</span> <span class="s">''</span>
<div class="newline"></div> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">texte_binaire</span><span class="p">:</span>
<div class="newline"></div> <span class="n">tampon</span> <span class="o">=</span> <span class="n">tampon</span><span class="o">+</span><span class="n">b</span>
<div class="newline"></div> <span class="k">if</span> <span class="n">tampon</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
<div class="newline"></div> <span class="n">texte</span> <span class="o">=</span> <span class="n">texte</span><span class="o">+</span><span class="n">code</span><span class="p">[</span><span class="n">tampon</span><span class="p">]</span>
<div class="newline"></div> <span class="n">tampon</span> <span class="o">=</span> <span class="s">''</span>
<div class="newline"></div> <span class="k">return</span> <span class="n">texte</span>
<div class="newline"></div></pre></div>
</div>
</div>
<p><div style="clear: both"></div></p>
</div>
</div>
</div>
</div>
</div>
<div class="clearer"></div>
</div>
<div class="related">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="stochastique.html" title="3. Systèmes statistiques : Nombres aléatoires - Monte Carlo"
>suivant</a></li>
<li class="right" >
<a href="preparation.html" title="1.1.1.1. Préparer la formation: téléchargement d’Anaconda"
>précédent</a> |</li>
<li><a href="index.html">Python scientifique - ENS Paris</a> »</li>
</ul>
</div>
<!-- your html code here -->
<a href="http://www.ens.fr"><img src="_static/ENS_Logo.png"
alt="ENS" height="100"></a>
<a href="http://www.inria.fr"><img src="_static/logo-inria.jpg"
alt="INRIA" height="60"></a>
<a href="http://www.saint-gobain-recherche.fr/fr/"><img
src="_static/logoSGR.png" alt="Saint-Gobain Recherche" height="60"></a>
<script language="JavaScript"
src="http://freehostedscripts.net/ocount.php?site=ID1953783&name=pages
visitées"></script>
</body>
</html>