« Programmation Python/Dictionnaires » : différence entre les versions

Contenu supprimé Contenu ajouté
→‎Différences entre deux dictionnaires : Opérateur de soustraction plus pertinent que le xor
DannyS712 (discussion | contributions)
m <source> -> <syntaxhighlight> (phab:T237267)
Ligne 11 :
Puisque le type dictionnaire est un type modifiable, nous pouvons commencer par créer un dictionnaire vide, puis le remplir petit à petit. Du point de vue syntaxique, on reconnaît une structure de données de type dictionnaire au fait que ses éléments sont enfermés dans ''une paire d'accolades''. Un dictionnaire vide sera donc noté <code>{ }</code> :
 
<sourcesyntaxhighlight lang=python>
dico = {}
dico['computer'] = 'ordinateur'
Ligne 18 :
print dico
{'computer': 'ordinateur', 'keyboard': 'clavier', 'mouse': 'souris'}
</syntaxhighlight>
</source>
 
Comme vous pouvez l'observer dans la ligne ci-dessus, un dictionnaire apparaît comme une série d'éléments séparés par des virgules (le tout étant enfermé entre deux accolades}. Chacun de ces éléments est constitué d'une paire d'objets : un index et une valeur, séparés par un double point.
Ligne 98 :
 
Il est donc utilisé pour les "foreach" :
<sourcesyntaxhighlight lang=python>
for key, value in invent.items():
print "Clé : %s, valeur : %s." % (key, value)
</syntaxhighlight>
</source>
 
=== ''copy'' ===
La méthode <code>copy()</code> permet d'effectuer une vraie copie d'un dictionnaire. Il faut savoir en effet que la simple affectation d'un dictionnaire existant à une nouvelle variable crée seulement une nouvelle référence vers le même objet, et non un nouvel objet (''aliasing''). Par exemple, l'instruction ci-dessous ne définit pas un nouveau dictionnaire (contrairement aux apparences) :
 
<sourcesyntaxhighlight lang=python>
>>> stock = invent
>>> print stock
Ligne 114 :
>>> print stock
{'oranges': 274, 'poires': 137}
</syntaxhighlight>
</source>
 
Si nous modifions "invent", alors <code>stock</code> aussi est modifié, et vice-versa (ces deux noms désignent en effet le même objet dictionnaire dans la mémoire de l'ordinateur).
 
Pour obtenir une vraie copie (indépendante) d'un dictionnaire préexistant, il faut employer la méthode <code>copy()</code> :
<sourcesyntaxhighlight lang=python>
>>> magasin = stock.copy()
>>> magasin['prunes'] = 561
Ligne 128 :
>>> print invent
{'oranges': 274, 'poires': 137}
</syntaxhighlight>
</source>
 
=== ''update'' ===
Il est possible de concaténer deux dictionnaires avec cette méthode :
<sourcesyntaxhighlight lang="python">
>>> d = {'apples': 1, 'oranges': 3, 'pears': 2}
>>> ud = {'pears': 4, 'grapes': 5, 'lemons': 6}
Ligne 139 :
{'grapes': 5, 'pears': 4, 'lemons': 6, 'apples': 1, 'oranges': 3}
>>>
</syntaxhighlight>
</source>
 
{{remarque|les doublons sont automatiquement fusionnés.}}
Ligne 233 :
Comme vous l'avez vu plus haut, les éléments d'un dictionnaire ne sont pas disposés dans un ordre particulier. Des opérations comme la concaténation et l'extraction (d'un groupe d'éléments contigus) ne peuvent donc tout simplement pas s'appliquer ici. Si vous essayez tout de même, Python lèvera une erreur lors de l'exécution du code :
 
<sourcesyntaxhighlight lang=python>
>>> print arb[1:3]
***** Erreur : KeyError: slice(1, 3, None) *****
</syntaxhighlight>
</source>
 
Vous avez vu également qu'il suffit d'affecter un nouvel indice (une nouvelle clé) pour ajouter une entrée au dictionnaire. Cela ne marcherait pas avec les listes :
 
<sourcesyntaxhighlight lang=python>
>>> invent['cerises'] = 987
>>> print invent
Ligne 248 :
>>> liste[4] ='salami'
***** IndexError: list assignment index out of range *****
</syntaxhighlight>
</source>
 
Du fait qu'ils ne sont pas des séquences, les dictionnaires se révèlent donc particulièrement précieux pour gérer des ensembles de données où l'on est amené à effectuer fréquemment des ajouts ou des suppressions, dans n'importe quel ordre. Ils remplacent avantageusement les listes lorsqu'il s'agit de traiter des ensembles de données numérotées, dont les numéros ne se suivent pas.
Ligne 278 :
<ol>
<li>
<sourcesyntaxhighlight lang=python>
#!/usr/bin/env python
# coding: utf-8
Ligne 309 :
else:
print "*** nom inconnu ! ***"
</syntaxhighlight>
</source>
</li>
 
<li>
<sourcesyntaxhighlight lang=python>
# Échange des clés et des valeurs dans un dictionnaire
dico = {'Computer':'Ordinateur',
Ligne 329 :
 
print(dic_inv)
</syntaxhighlight>
</source>
</li>
</ol>
Ligne 370 :
<ol>
<li>
<sourcesyntaxhighlight lang=python>
# histogramme
nFich = raw_input('Nom du fichier : ')
Ligne 386 :
liste.sort()
print liste
</syntaxhighlight>
</source>
</li>
 
<li>
<sourcesyntaxhighlight lang=python>
nFich = raw_input('Nom du fichier à traiter : ')
fi = open(nFich, 'r')
Ligne 426 :
for item in liste:
print item[0], ":", item[1]
</syntaxhighlight>
</source>
</li>
 
<li>
<sourcesyntaxhighlight lang=python>
# encodage d'un texte dans un dictionnaire
 
Ligne 466 :
for clef, valeur in dico.items():
print clef, ":", valeur
</syntaxhighlight>
</source>
</li>
</ol>
Ligne 475 :
Il arrive fréquemment que l'on ait à diriger l'exécution d'un programme dans différentes directions, en fonction de la valeur prise par une variable. Vous pouvez bien évidemment traiter ce problème à l'aide d'une série d'instructions <code>if - elif - else</code> , mais cela peut devenir assez lourd et inélégant si vous avez affaire à un grand nombre de possibilités. Exemple :
 
<sourcesyntaxhighlight lang=python>
materiau = raw_input("Choisissez le matériau : ")
 
Ligne 487 :
fonctionD()
elif ... etc ...
</syntaxhighlight>
</source>
 
Les langages de programmation proposent souvent des instructions spécifiques pour traiter ce genre de problème, telles les instructions <code>switch</code> ou <code>case</code> du C ou du Pascal. Python n'en propose aucune, mais vous pouvez vous tirer d'affaire dans bien des cas à l'aide d'une liste, ou mieux encore à l'aide d'un dictionnaire. Exemple :
 
<sourcesyntaxhighlight lang="python">
materiau = raw_input("Choisissez le matériau : ")
 
Ligne 500 :
... etc ...}
dico[materiau]()
</syntaxhighlight>
</source>
 
Les deux instructions ci-dessus pourraient être condensées en une seule, mais nous les laissons séparées pour bien détailler le mécanisme :
Ligne 510 :
Vous pouvez encore améliorer la technique ci-dessus en remplaçant cette instruction par sa variante ci-dessous, qui fait appel à la méthode <code>get()</code> afin de prévoir le cas où la clé demandée n'existerait pas dans le dictionnaire (vous obtenez de cette façon l'équivalent d'une instruction <code>else</code> terminant une longue série de <code>elif</code>) :
 
<sourcesyntaxhighlight lang=python>
dico.get(materiau, fonctAutre)()
</syntaxhighlight>
</source>
 
Lorsque la la valeur de la variable "materiau "ne correspond à aucune clé du dictionnaire, c'est la fonction <code>fonctAutre()</code> qui est invoquée.
Ligne 519 :
 
Par exemple pour savoir quels sont les éléments importés<ref>https://stackoverflow.com/questions/32815640/how-to-get-the-difference-between-two-dictionaries-in-python</ref> :
<sourcesyntaxhighlight lang="python">
d1 = locals().copy()
import pywikibot
d2 = locals()
print(set(d2) - set(d1))
</syntaxhighlight>
</source>
 
== Références ==