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 :

tableau sérialisés en python


Sujet :

Python

  1. #1
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut tableau sérialisés en python
    Bonjour, j'essaie de reproduire une table de hash php en python, mais je n'y arrive pas. Il faut dire que je viens de commencer à apprendre python, et actuellement, les tables de hash me manquent même si l'utilisation des dictionnaires s'en approche

    Voilà ce que je veux faire concrètement. Je récupère une liste de données d'un base oracle. Cette liste se présente sous la forme
    1 text nombre
    1 text nombre
    1 text nombre
    1 text nombre
    1 text nombre
    2 text nombre
    2 text nombre
    2 text nombre
    2 text nombre
    2 text nombre
    ...
    ...

    Le but est de créer un élément avec un indice unique dans le quel j'ajouterai toutes les données du même indice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    1 (
       text nombre
       text nombre
       text nombre
    )
    2 (
       text nombre
       text nombre
       text nombre
    )
    En php:
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Array
    (
        [1] => Array
            (
                [0] => text
                [1] => nombre
                [2] => text
                [3] => nombre
            )
        [2] => Array
            (
                [0] => text
                [1] => nombre
                [2] => text
                [3] => nombre
            )
        [3] => Array
            (
                [0] => text
                [1] => nombre
                [2] => text
                [3] => nombre
            )
    )
    Avec les dictionnaires, j'ai trouvé comment créer une structure de ce type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [0] (
       'text'
       nombre
    )
    [1] (
       'text'
       nombre
    )
    [2] (
       'text'
       nombre
    )
    Comment puis-je arriver à créer en python une structure similaire à celle de php ?

    J'espère que vous pourrez m'éclairer.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Wow, je suis vraiment pas sûr d'avoir compris, mais on va essayer.

    Tu peux créer un dictionnaire dont la clé sera tes indices et ta valeur sera une liste des données entrées.

    Ai-je compris?

  3. #3
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    euuhhh, oui, oui, mais bien sûr

    Mais comment on fait en python lol.

    pour un dico:

    mondico[mondice] = {text1: nombre}

    si j'ajoute un élément:
    mondico[mondice] = {text2: nombre2}

    le contenu est remplacé par les dernière valeurs ...

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Non un dico peut être construit de cette manière

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    dico = {1:[nombre, nombre2, nombre3, nombre4], 2:[...]}
    # dico[1] te renverra ta liste de nombre

  5. #5
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    oui, mais comme je différencie tout ça ?

    en fait la structure est la suivante avec les vraies valeurs:

    [pour l'indice 1]:
    annee2005 -> nombre
    annee2006 -> nombre
    annee2007 -> nombre
    annee2008 -> nombre

    Donc j'ai un seul indice qui contient 5 années (dans cet exemple), et à chaque année correspond un nombre.

    Est-ce que cette syntaxe est bonne ?

    list = {}
    list = {1:[annee2005, 200, annee2006, 300]}
    print list[1]

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dico = {1:{annee2005:nombre1, annee2006:nombre2,...}, 2:{...}}
    ?

    Sinon avec une simple liste de tuples, tu dois t'en sortir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> liste = [(1, 2005, 12), (1, 2006, 15), (2, 2007, 13)]
    >>> for i in liste:
    ...     ind, annee, nombre = i
    ...     if ind == 1 and annee == 2005:
    ...         print(nombre)
    ... 
    12
    Et si tu veux que tes tuples soient nommés, il y a le module collections et sa méthode namedtuple

  7. #7
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    J'aime bien l'idée du dico qui semble plus simple que les tuples.

    par contre, étant donné que je rempli au travers d'une boucle, je ne peux pas ajouter sans remplacer l'indice:

    dico = {}

    for i in ('annee2008','annee2006','annee2007'):
    dico = {1:{i:123}}

    print dico[1]

    une idée ? Il n'existerait pas une fonction append pour un élément d'un dico ?

  8. #8
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Hmmm je trouve ça plus complexe, mais si tu insistes, il faut faire ça en deux temps. Construction du dico secondaire et ensuite dico principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def dico(liste_annee, nombre):
    ...     dic = {}
    ...     for i in liste_annee:
    ...         dic[i] = nombre
    ...     return dic
    puis le principal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    d = {}
    d[1] = dico([2005, 2006, 2007, 2008], 123)
    Resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> d
    {1: {2008: 123, 2005: 123, 2006: 123, 2007: 123}}
    la méthode fromkeys fait cela aussi très bien

    Mais ça commence à devenir compliqué ton histoire

  9. #9
    Membre éclairé
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Par défaut
    Ok, n'étant pas expert (et très loin de l'être JJ), je veux bien une suggestion.
    Les données sortent d'une requête sql:

    1 Annee2005 300
    1 Annee2006 122
    1 Annee2007 756
    1 Annee2008 325
    1 Annee2009 48
    2 Annee2005 25
    2 Annee2006 366
    2 Annee2007 125
    2 Annee2008 874
    2 Annee2009 125

    Je veux au finale créer un tableau html avec:
    Annee2005 Annee2006 Annee2007 ..
    1 300 122 756
    2 25 366 125

    Comment le feriez-vous (mis à part la partie html que je connais déjà très bien) ?

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Une méthode simple en une boucle
    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
    16
     
    >>> table = (
    ...     (1, '2005', 100),
    ...     (1, '2006', 100),
    ...     (1, '2007', 100),
    ...     (2, '2005', 100),
    ...     (2, '2006', 100),
    ... )
    >>> d = dict()
    >>> for t in table:
    ...         if not d.has_key(t[1]):
    ...             d[t[1]] = list()
    ...         d[t[1]].append((t[0], t[2])
    ... 
    >>> d
    {'2006': [(1, 100), (2, 100)], '2007': [(1, 100)], '2005': [(1, 100), (2, 100)]}
    soit de manière plus lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    {
        '2006': [(1, 100), (2, 100)],
        '2007': [(1, 100)],
        '2005': [(1, 100), (2, 100)]
    }
    À partir de là, tu as un dictionnaire avec comme clés les entêtes de ton tableau, et comme valeurs des listes de tuples (chaque tuple = une ligne dans ton tableau).

    edit: ouais c'est pas exactement ça. mais l'idée est là ...

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 060
    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 060
    Par défaut
    Il y a plusieurs façons, mais je dirais dictionnaire, tuple et liste

    dico = {2005:[(1, 300), (2, 25)], 2006:[...]}

    Pour avoir quelquechose de complet (code non testé)

    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
    def insert(chaine):
        ind, annee, n = chaine.split()
        liste = [(ind, n)]
        if annee not in dico:
            dico[annee] = liste
        else:
            dico[annee].append((ind, n))
     
    dico = {}
    with open('mon_fichier.txt', 'r') as f:
        for ligne in f.readlines:
            ligne = ligne.strip('\n')
            insert(ligne)
     
    print(dico)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut
    bonjour, on peut utiliser defaultdic



    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
    16
     
    from  collections import defaultdict
     
    dico = defaultdict(list)
     
    f = open("mon_fichier.txt","r") 
     
    for i in f:
        id,annee,n=i.split()
        dico[annee].append((id,n))
    f.close()    
     
    for k,v in dico.items():
        print k
        for ns in v:
            print "%s - %s" % (ns)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. manipulation de tableau (like python)
    Par geekrider dans le forum Ruby
    Réponses: 1
    Dernier message: 10/09/2009, 16h28
  2. Traiter Un Tableau sous Python
    Par anass_59 dans le forum Bibliothèques tierces
    Réponses: 5
    Dernier message: 18/06/2009, 15h35
  3. import des donnees python vers tableau
    Par tsicc dans le forum Réseau/Web
    Réponses: 5
    Dernier message: 02/04/2008, 10h10
  4. Réponses: 4
    Dernier message: 25/07/2007, 10h29
  5. swig python tableau
    Par paulo2007 dans le forum Interfaçage autre langage
    Réponses: 1
    Dernier message: 23/04/2007, 09h18

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