A quoi sert un dictionnaire Python ? Peut-on s'en passer ? Gagne-t-on à utiliser ce procédé ? Est-ce que ça accélère la recherche ?
J'ai consulté des "tonnes" (non, j'exagère...) de documents dans Internet sur la question, sans parvenir à y cerner une quelconque utilité : je connais le procédé, j'ai même fait un dictionnaire sur un album de Supertramp :
{"Supertramp – Crime Of The Century (1974) " : ["01 School", "02 Bloody Well Right", "03 Hide in Your Shell", "04 Asylum", "05 Dreamer", "06 Rudy", "07 If Everyone Was Listening", "08 Crime of the Century"]}
Et après, qu'est-ce que j'en fais ? Comment me servir de cela ?
Est-ce que l'un d'entre vous aurait un lien sur un site suffisamment explicite ?
Si tu poses la question pour un dico, tu la poseras forcément pour les autres collections (liste, tuple, ...)
Tu dois tester et voir ce qui correspond le mieux. Par exemple, dans ton dico, je mettrais les titres des albums dans un tuple parce que les titres ne changeront jamais et un tuple est une collection immuable contrairement à la liste.
Tu commences par le basique (une variable simple) :
album1 = "Supertramp - Crime Of The Century"
titre1 = "School"
titre2 = "Bloody Well Right"
### bref c'est chiant
alors une liste ? Pas mal pour les titres, mais pour le nom de l'album on garde une variable simple.
Bon, un dico ? Ah, c'est pas mal, la clé sera l'album et sa valeur une liste (non, un tuple c'est mieux). Ainsi, tu peux mettre tous les albums de Supertramp.
Selon moi, il ne faut pas s'obstiner à optimiser au maximum, il faut maîtriser son code. Si on te dit d'utiliser tel type de variable mais que tu ne comprends pas, ce sera plus difficile pour déboguer.
Ca peut être utile par exemple pour traiter des données d'une certaine manière, je reprends un truc que j'ai posté sur un autre forum : En entrée on a ça :
#Je découpe chaque paragraphe en 3 :
#[['>NW_020169394.1_41 [10497-10619]' , 'KE647364.1_346 [38084-37959]' , 'MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET'] , ... ]
lines = [[x.split('|')[0], x.split('|')[1].split('\n')[0], x.split('\n')[1]] for x in code.split('\n \n')]
#Je créé un dictionnaire avec comme clé le premier élément (ex : '>NW_020169394.1_41 [10497-10619]')
# des sous-listes que je viens de créer plus haut, à laquelle j'attribue une liste composé des deux autres
# éléments de la sous-liste (ex : ['|KE647364.1_346 [38084-37959]' , '|MDQLSRKLNLTYLKVGILTSQNEFVTKHLLIIKGLKIFTET'])
dico = {}
for x,y,z in lines:
try:
dico[x][0]+=" |"+y #Ici je rajoute juste le second élément (ex : '|KE646921.1_20 [383-240]')
except:
dico[x]=["|"+y,z]
for x in dico:
print(x, dico[x][0],'\n',dico[x][1])
A quoi sert un dictionnaire Python ? Peut-on s'en passer ? Gagne-t-on à utiliser ce procédé ? Est-ce que ça accélère la recherche ?
Un dictionnaire c'est créer une structure où tu peux indexer des objets et y accéder rapidement. On peut comparer cela aux bases de données, où la différence est la persistance des données.
On peut s'en passer, le langage C n'a pas ce type de structure.
On gagne à utiliser ce procédé, oui ! Mais en mettre partout n'est pas une solution, il faut réfléchir à comment concevoir sa solution. Un des exemples qui me vient à l'esprit, est un système de cache qui permet d'aller rechercher l'historique de certaines valeurs de manière optimisée. Voir du côté d'un problème comme Fibonacci par exemple.
Ça accélère la recherche à tel point que c'est quasi instantanée, encore faut-il avoir à rechercher, à créer correctement sa structure...
Le dictionnaire comme toutes autres structures en python lors de sa création se justifie, on ne l'utilise pas à toutes les sauces, ce n'est donc pas un problème à tout.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
A quoi sert un dictionnaire Python ? Peut-on s'en passer ? Gagne-t-on à utiliser ce procédé ? Est-ce que ça accélère la recherche ?
J'ai consulté des "tonnes" (non, j'exagère...) de documents dans Internet sur la question, sans parvenir à y cerner une quelconque utilité : je connais le procédé, j'ai même fait un dictionnaire sur un album de Supertramp :
{"Supertramp – Crime Of The Century (1974) " : ["01 School", "02 Bloody Well Right", "03 Hide in Your Shell", "04 Asylum", "05 Dreamer", "06 Rudy", "07 If Everyone Was Listening", "08 Crime of the Century"]}
Et après, qu'est-ce que j'en fais ? Comment me servir de cela ?
Tu as créé un dictionnaire d'UN SEUL album donc l'intérêt est limité. Imagine plutôt un groupe de 1000 personnes dont on connait le pseudo, leur age, le mail et le numéro de téléphone. On crée alors un dictionnaire D reliant le nom (pseudo) de chaque personne à ses infos personnelles (une liste ici de trois éléments). L'intérêt c'est que :
tu peux connaître les données de la personne par une seule recherche D[chris]
tu peux savoir si telle ou telle personne est enregistrée
tu peux supprimer des personnes
tu peux rajouter des personnes
tu peux modifier des données
autant de choses que tu feras de manière totalement inefficace avec une liste. Donc, pour faire simple, un dictionnaire c'est une liste indexée par des objets qui ne sont pas des entiers consécutifs à partir de 0.
C'est une structure de données fondamentales, c'est implémenté le plus souvent par une table de hachage. Le langage C n'a pas en effet (pas en standard du moins, car il y en a de très efficaces, comme khash ou STC) et cela a conduit les gens à se tourner vers le C++.
Les exemples d'usage de dictionnaires sont innombrables. Imagine que tu veuilles écrire un programme qui convertisse la date du jour, par exemple 25 juillet 2021 en 25/07/2021. Tu auras certainement besoin d'un dictionnaire. Pour convertir dans l'autre sens une liste suffit.
Et après, qu'est-ce que j'en fais ? Comment me servir de cela ?
L'information qu'on a est l'album sorti par le groupe Supertramp en 1974 nommé "Crime Of The Century" et la liste des titres des chansons qu'il contient.
Pourquoi avez vous choisi de la représenter par un dictionnaire contenant une seule clef "Supertramp – Crime Of The Century (1974)" associée à la liste des titres? Qu'est ce que vous cherchez à faire? Et est-ce qu'un dictionnaire va aider? Voilà des questions qui touchent à la conception (je veux faire quoi) et à comment le réaliser.
Si on doit avoir plusieurs albums de Supertramp et d'autres groupes que ... peut être qu'on pourrait avoir un dictionnaire où la clef serait le groupe associé aux albums? Est ce que ces albums sont une simple liste contenant des tuples (le nom de l'album, l'année, les titres) ou est-ce qu'on en fait un dictionnaire dont la clef serait l'année? le titre? autre chose.
Un des exemples qui me vient à l'esprit, est un système de cache qui permet d'aller rechercher l'historique de certaines valeurs de manière optimisée. Voir du côté d'un problème comme Fibonacci par exemple.
La suite de Fibonacci ? je ne saisis pas le rapport avec un dictionnaire.
Voilà un exemple qui reprend l'idée de ton premier post, ici une liste de dictionnaires :
cd = [
{
"Artiste": "Supertramp",
"Album": "Crime Of The Century",
"Année": "1974",
"Titres": (
"School",
"Bloody Well Right",
"Hide in Your Shell",
"Asylum",
"Dreamer",
"Rudy",
"If Everyone Was Listening",
"Crime of the Century",
),
},
{
"Artiste": "Genesis",
"Album": "Wind and Wuthering",
"Année": "1976",
"Titres": (
"Eleventh Earl of Mar",
"One for the Vine",
"Your Own Special Way",
"Wot Gorilla",
"All in a Mouse's Night",
"Blood on the Rooftops",
"Unquiet Slumbers for the Sleepers",
"In That Quiet Earth",
"Afterglow",
),
},
{
"Artiste": "Supertramp",
"Album": "Even in the quietest moments",
"Année": "1977",
"Titres": (
"Give A Little Bit",
"Lover Boy",
"Even In The Quietest Moments",
"Downstream",
"Babaji",
"From Now On",
"Fool's Overture",
),
},
]
def show_all():
for album in cd:
for key, value in album.items():
if key == "Titres":
for i, song_name in enumerate(value):
print(f"Piste n°{i+1}: {song_name}")
else:
print(f"{key} : {value}")
print("")
def find_song_name(name):
find = False
for album in cd:
for i, song_name in enumerate(album["Titres"]):
if song_name == name:
find = True
print("Titre trouvé...")
print("Artiste : " + album["Artiste"])
print("Album : " + album["Album"])
print("Année : " + album["Année"])
print(f"{name} : Piste n°{i+1}")
if find is False:
print("Titre non trouvé!!!")
show_all()
find_song_name("In That Quiet Earth")
Tout d'abord, un grand merci à vous tous pour vos réponses : je suis impressionné et je suis "clairement" curieux de décortiquer cette masse d'informations.
Le fait d'avoir posé la question en titre indique, de toute façon, que même si je n'en voyais pas l'utilité, j'entrevoyais plus ou moins, et de manière diffuse, que ce procédé pouvait être une solution à une recherche pour une organisation personnelle de mes documents en tous genres : là, je pense à des albums de musique, mais ce peut être aussi ma bibliothèque (de livres, je précise), mes fiches de documentation que je scanne dans des revues diverses, mes vidéos que j'enregistre sur des chaînes thématiques, mes photos sur tous les thèmes (géographie, monuments...) etc., la liste n'est pas exhaustive... L'un des critères serait donc la nature du document : livre, CD, vidéo, photo, fiche et ainsi de suite, tout cela réuni en un seul dictionnaire !
J'ai consulté la documentation (très fournie et très détaillée) de Pascal Ortiz : tu te montres ici presque dithyrambique quant à la création et l'utilisation du dictionnaire, je suis assez surpris de ne pas trouver de chapitre spécifique dans tes productions. Peut-être pourrais-tu y consacrer un dossier...
D'après vos réponses à tous, je crois que je peux envisager la constitution d'un dictionnaire construit de la sorte : si vous avez des avis, quels qu'ils soient, n'hésitez pas à me les soumettre.
Merci encore à vous tous, et en particulier à Diablo 76 pour son script qui me donne des idées (enthousiasmantes ! La création d'index apporterait aussi une méthode de recherche efficace).
Cordialement.
- Edité par chrisblues59 25 juillet 2021 à 17:12:19
là, je pense à des albums de musique, mais ce peut être aussi ma bibliothèque (de livres, je précise), mes fiches de documentation que je scanne dans des revues diverses, mes vidéos que j'enregistre sur des chaînes thématiques, mes photos sur tous les thèmes (géographie, monuments...) etc., la liste n'est pas exhaustive... L'un des critères serait donc la nature du document : livre, CD, vidéo, photo, fiche et ainsi de suite, tout cela réuni en un seul dictionnaire !
Une petite base de données avec sqlite serait bien plus adapté pour ce genre de choses.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Admettons mais on n'a pas besoin de dictionnaire pour ça, une simple liste suffit. Par ailleurs, si tu veux calculer fibo(400) tu vas créer un dictionnaire de 400 valeurs alors qu'en fait le calcul courant n'a besoin que de stocker juste deuxvaleurs, le choix me paraît donc discutable. Une façon classique de contourner ce problème de cache est d'écrire le code suivant :
def fibo(n, a, b):
if n==0:
return a
return fibo(n-1, b, a+b)
print(fibo(997,0, 1))
La fonction est toujours récursive, il n'y a aucun stockage et, en plus, on peut calculer des valeurs de la suite pour des indices deux fois plus grand (dans ton lien, tu auras, sur l'implémentation courante de Python, une recursion error pour n autour de 500).
Fibonacci n'était qu'un exemple et peut être pas le bon, c'est le principe de cache et l'utilisation du dictionnaire qui est important.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard) La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Mais une petite question : une base de données peut se construire avec une structure en dictionnaire, non ?
Merci de ton avis.
Regardez le code de Diablo76, c'est juste du code Python. Comment ajouter un nouvel album sans éditer le source? Est-il raisonnable que les utilisateurs soient assez bons programmeurs pour le faire? Plutôt que mettre çà dans un script Python on pourrait en faire un fichier JSON (çà c'est éditable pas l'utilisateur lambda) et se retrouver à lire tout le fichier au démarrage du programme et en créer une nouvelle version à chaque mise à jour.
Une base de donnée (à la sqlite) serait plus souple pour faire des recherches, ajouter un album,... c'est fait pour.
Un dictionnaire n'est pas là pour organiser des données "utilisateur" mais pour organiser les objets du programme. On peut récupérer cette structure en ayant récupéré le contenu d'un fichier JSON et on va faire avec.... bien obligé mais il ne faut pas tout confondre.
Vous êtes perdu dans tout çà? Normal... vous découvrez Python et Python ouvre la porte vers le monde de la programmation et de l'informatique. Pas facile de s'y repérer. Mais c'est comme çà.
MPS, j'ai bien pris conscience que la présence des accolades ne signifiait pas toujours qu'un dictionnaire avait été mis en œuvre. Dans ce cas précis, ce n'en est pas un.
Mais, dans mes consultations sur le net, je suis souvent tombé sur ce procédé du dictionnaire : la lecture des explications m'a interpellé, cependant, je doutais de son utilité par rapport à mon projet, et c'est pourquoi j'ai soumis ma question au forum.
A vous lire, MPS, je redeviens dubitatif : "Une petite base de données avec sqlite serait bien plus adapté pour ce genre de choses."
Effectivement, quelle que soit la masse des documents que je pourrais apporter dans mon projet, à mon niveau, au niveau d'un individu dans son propre environnement, elle serait amplement suffisante. L'idée du dictionnaire vient du fait que j'ai envie que ce soit performant : alors, quand je lis Fred 1599 : "Ça accélère la recherche à tel point que c'est quasi instantanée, encore faut-il avoir à rechercher, à créer correctement sa structure..." ou Pascal Ortiz : "C'est une structure de données fondamentales, [...] Les exemples d'usage de dictionnaires sont innombrables.", ça fait "tilt".
Bon, en attendant, je vais m'occuper de mes petits scripts d'entraînement à sqlite : j'ai besoin de quelque temps pour réfléchir.
Merci à tous.
Quel est l'intérêt du dictionnaire Python ?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Découverte Python Doc Tkinter Les chaînes de caractères
Découverte Python Doc Tkinter Les chaînes de caractères
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)
Découverte Python Doc Tkinter Les chaînes de caractères
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)