IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

des dictionnaires dans une liste


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Par défaut des dictionnaires dans une liste
    bonsoir à tous, c est tres timidement que je viens vers vous, en effet je decouvre python depuis deux semaines seulement et trouve ce langage interessant.

    apres avoir lu pas mal je voudrais aujourd'hui, créé avec mes tres pauvres connaissances dans ce langages (c'est rien de le dire...) : une liste contenant plusieurs dictionnaires. pour en faire un carnet d'adresses.

    je m'explique: [{nom:truc, prenom:bidule, adresse:20 rue etc, tel:0600000}, {nom:truc, prenom:dulebi, adresse:20 rue etc, tel:0600000}]

    pourriez vous me dire si c'est possible ou, sinon, existe t il une facon plus simple de commencer.

    je vous avez averti!!!! je suis un vrai debutant et il est sur que j ai encore beaucoup à apprendre..

    enfin, merci de m'aider si vous le souhaitez, bonne soiree à tous

    jeannoel

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    pourriez vous me dire si c'est possible ou, sinon, existe t il une facon plus simple de commencer.
    Oui c'est possible et je trouve que c'est une bonne idée.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Très bonne idée que tu as là.

    Toutefois, faut faire attention à ne pas exploser ta mémoire; Si c'est pour t'amuser avec les listes et les dicos à stocker 10 ou 20 noms ça ira mais si tu veux t'engager vers une vrai appli à aller stocker une quantité considérable de noms (et à les sauvegarder dans un fichier et à les récupérer depuis un fichier) ce serait dommage de le faire "à la main" alors qu'il existe un tas d'outils déjà tous faits

    Par exemple tu as sqlite. Il s'agit d'une mini bdd intégrée dans Python qui te permet de manipuler des datas à la façon sql (insert, select, update)

    Exemple (écrit en python v2 mais j'ai un peu vérfié et je pense qu'il fonctionnera aussi en Python v3)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    #!/usr/bin/env python 
    # -*- coding: utf-8 -*-
     
    import sqlite3 
     
    bdd=sqlite3.connect("bdd.sqlite")	# ici il faut un nom de fichier qui contiendra la bdd mais tu peux aussi mettre ":memory:" et tout sera stocké en mémoire (et bien entendu perdu quand le programme se termine)...
    curs=bdd.cursor()
    try:
    	curs.execute(
    		"create table personne("\
    			"nom char(20) not null,"\
    			"prenom char(20) not null,"\
    			"adresse char(50)"\
    		")"
    	)
    except sqlite3.OperationalError:
    	# La table existe déjà
    	pass
    # try
     
    # Insertion
    curs.execute(
    	"insert into personne(nom, prenom, adresse) values ('truc', 'bidule', '20 rue etc')"
    )
    bdd.commit()
     
    # Récupération datas
    curs.execute("select * from personne")
    print(
    	"\n".join(
    		"%d: nom [%s], prenom [%s], adresse [%s]" % (
    			i+1,
    			c[0],
    			c[1],
    			c[2],
    		) for (i, c) in enumerate(curs.fetchall())
    	)
    )
     
    # Fermeture curseur et bdd
    curs.close()
    bdd.close()

    Bon, c'est déjà un poil plus compliqué mais ça t'ouvre d'autres perspectives...

    Tu as aussi des outils de nosql dédié au stockage de datas comme mongodb et son module python pymongo

    Bref tout un monde nouveau s'ouvre à toi...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Oui, on peut faire une liste de dictionnaires, mais ce n'est pas comme ça que je fais dans ce genre de problème.

    En effet, ici, chaque ligne comportant un dictionnaire va "consommer" de la mémoire en gardant toutes les clés. Ensuite, il faut voir après la facilité ou la difficulté avec laquelle des opérations élémentaires vont pouvoir être faites. Par exemple, est-ce que je peux faire facilement un tri selon le prénom (ou le téléphone, la ville)? Un filtrage? Une recherche? Etc...

    Il vaut mieux faire une "liste de listes" comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    annuaire = [["truc", "bidule", "20 rue etc", "0600000"], ["truc", "dulebi", "20 rue etc", "0600000"]]
    Ainsi, le prénom ("bidule", "dulebi", etc...) aura toujours l'index 1 (les index commencent à 0)

    On peut trier selon les prénoms comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    annuaire.sort(key=lambda v: v[1])
    On peut filtrer l'annuaire pour avoir toutes les fiches qui ont le prénom "bidule" comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    annuaire2 = [fiche for fiche in annuaire if fiche[1]=="bidule"]
    Pour une fiche particulière, rien n'empêche de retrouver un format dictionnaire, si on a définit les clés, ou de faire le contraire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    annuaire = [["truc", "bidule", "20 rue etc", "0600000"], ["truc", "dulebi", "20 rue etc", "0600000"]]
     
    # extraction de la 2ème fiche de l'annuaire
    fiche = annuaire[1]
     
    # fiche sous forme de dictionnaire
    fichedic = {"nom":fiche[0], "prenom":fiche[1], "adresse":fiche[2], "tel":fiche[3]}
    print fichedic
    # affiche: {'nom': 'truc', 'tel': '0600000', 'adresse': '20 rue etc', 'prenom': 'dulebi'}
     
    # retour à la même fiche sous forme de liste:
    fiche = [fichedic["nom"], fichedic["prenom"], fichedic["adresse"], fichedic["tel"], ]
     
    print fiche
    # affiche: ['truc', 'dulebi', '20 rue etc', '0600000']
    A noter que l'affichage de la fiche sous forme de dictionnaire a une caractéristique qui peut gêner : l'ordre des éléments de la fiche est modifié (il existe cependant un autre format de dictionnaire qui respecte l'ordre).

    Etc...

    Bref, le format "liste de listes" est plus facile à manipuler.

    Mais si l'annuaire devient gros, l'idée de Sve@r est meilleure: utiliser un système de gestion de base de données comme sqlite3: c'est très puissant et très rapide.

  5. #5
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    Bonjour à tous.

    Utiliser un dictionnaires pour stoquer l'ensemble des informations concernant une personne c'est bien.
    Créer et utiliser une classe Personne c'est beaucoup mieux, mais tu aura le temps de voir ça avec la POO.

    Contrairement à tyrtamos je déconseille fortement l'utilisation de liste de liste.

    Premièrement parce que consommation mémoire n'est pas critique, ton programme tourne sur un PC, pas une calculatrice.
    mais surtout que lorsque tu aura dans ton programme des trucs du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    annuaire[i][0][j][4][3]
    à la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    annuaire[i]["amis"][j]["téléphone"]["bureau"]
    Pour récupérer le numero de téléphone de bureau de l'ami i de la personne j, ça sera beaucoup plus dur à relire.

    l'utilisation d'une liste de dictionnaire ne change rien à la facilité ou la difficulté avec laquelle des opérations élémentaires vont pouvoir être faites

    On peut trier selon les prénoms comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    annuaire.sort(key=lambda v: v["prénom"])
    On peut filtrer l'annuaire pour avoir toutes les fiches qui ont le prénom "bidule" comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    annuaire2 = [fiche for fiche in annuaire if fiche["prénom"]=="bidule"]
    Toutefois, faut faire attention à ne pas exploser ta mémoire; Si c'est pour t'amuser avec les listes et les dicos à stocker 10 ou 20 noms
    Exploser ta mémoire ! 10 ou 20 noms !

    Faire un dico de 1000000 d'entrées ne pose pas de problème. Sauf si ton ordi n'a pas 50 Mo de mémoire disponible...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    >>> import sys
    >>> sys.getsizeof(dict(zip(range( 1000000 ), range(1000000))))
    50331928
    Après oui il faudra trouver un moyen de stoquer sur disque tes données, une BDD est une bonne solution. Si tu débute en programmation,
    le module pickle permet de stoquer une liste dans un fichier, ce sera plus simple dans un premier temps.

    Bon courrage pour ton apprentisage.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par vincent.mbg Voir le message
    Contrairement à tyrtamos je déconseille fortement l'utilisation de liste de liste.
    Comme quoi il y a autant de solutions que d'informaticien, chacun pensant que sa solution est la meilleure (et c'est mon cas )...

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par vincent.mbg Voir le message
    Citation Envoyé par Sve@r Voir le message
    Toutefois, faut faire attention à ne pas exploser ta mémoire; Si c'est pour t'amuser avec les listes et les dicos à stocker 10 ou 20 noms
    Exploser ta mémoire ! 10 ou 20 noms !
    S'il te plait, ne fais pas semblant de ne pas avoir compris juste pour le plaisir d'être cassant. Tu sais très bien que ma phrase exacte est celle-ci
    Citation Envoyé par Sve@r Voir le message
    Si c'est pour t'amuser avec les listes et les dicos à stocker 10 ou 20 noms ça ira
    et que, par conséquent, cela ne signifie pas ce que tu sous entends !!!

    Citation Envoyé par vincent.mbg Voir le message
    mais surtout que lorsque tu aura dans ton programme des trucs du genre:
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    annuaire[i][0][j][4][3]
    Pour récupérer le numero de téléphone de bureau de l'ami i de la personne j, ça sera beaucoup plus dur à relire.
    Juste pour le plaisir: dans l'exemple de Tyrtamos, tu n'auras jamais annuaire[i][0][j][4][3] car ça sous-entendrait que "annuaire" est un tableau à 5 dimensions alors que dans l'exemple de Tyrtamos, il n'en a que 2.
    Bon on peut imaginer que certains champs contiennent eux-mêmes d'autres sous-listes mais même comme ça, ça ne s'écrit pas ainsi.
    Si tu veux récupérer le n° de téléphone de l'ami "i" de la personne "j", il faudra alors écrire personne[personne[j][4][i]][3] (en sous-entendu que le champ n° 4 de la liste des personnes contient un tuple contenant chaque indice de chacun de ses amis et que le champ n° 3 contient son n° de téléphone). Hé oui, c'est pas tout de démonter quelqu'un d'autre mais encore faut-il le faire en manipulant correctement les outils qu'il propose...

    Citation Envoyé par vincent.mbg Voir le message
    Faire un dico de 1000000 d'entrées ne pose pas de problème
    Mouais aucun. Mais si tu veux ensuite commencer à les trier sur le nom dans un cas, puis sur le prénom dans un autre, puis sur l'âge dans un 3° ça ne posera là non plus aucun problème sauf que ça prendra 20 fois plus de temps que si tu utilises d'autres solutions plus adaptées à ce genre de volumétrie
    Voilà, moi aussi je sais casser mais tu vois, moi je le fais sans modifier ou tronquer tes écrits...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [VB.NET][ListView]des images dans une list view
    Par pcdj dans le forum Windows Forms
    Réponses: 1
    Dernier message: 16/12/2005, 12h08
  2. Intercaler des "titres" dans une liste ?
    Par tikawua dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/10/2005, 10h40
  3. [Lisp] Suppression des parenthèses dans une liste
    Par bourdaillet dans le forum Lisp
    Réponses: 3
    Dernier message: 19/12/2004, 21h02
  4. [langage] Comment rajouter des champs dans une liste
    Par toto_titi dans le forum Langage
    Réponses: 4
    Dernier message: 28/08/2003, 14h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo