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 :

Créer un tableau à plusieurs dimensions


Sujet :

Python

  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut Créer un tableau à plusieurs dimensions
    Bonjour à tous,

    Je récolte des données issue de la lecture d'un fichier csv qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TABLE|ACTION|DATE|HEURE|PIECE|CHAMP|LIGNE|VALEUR <--- Entête non présente dans le fichier
     
    SQUOTE|INSERT|01-07-2021|143704|DEVHIL21070001| |SQHNUM|DEVHIL21070001
    SQUOTE|UPDATE|01-07-2021|143758|DEVHIL21070001| |QUODAT|12082021
    SQUOTED|UPDATE|01-07-2021|144844|DEVHIL21070001|1000|QTY|10
    SQUOTED|INSERT|01-07-2021|152017|DEVHIL21070001|2000|ITMREF|STA
    SQUOTED|INSERT|01-07-2021|152017|DEVHIL21070001|2000|QTY|1
    SQUOTE|DELETE|01-07-2021|162821|DEVHIL21070001| |QUODAT|
    SQUOTE|DELETE|01-07-2021|162821|DEVHIL21070001| |SQHNUM|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|1000|ITMREF|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|1000|QTY|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|2000|ITMREF|
    SQUOTED|DELETE|01-07-2021|162821|DEVHIL21070001|2000|QTY|
    Ce fichier est issue d'une base de données qui réalise une audit par rapport à des actions faites sur des tables et des champs. Je n'ai pas la main sur la structure du résultat. Je dois traiter ce fichier pour mettre à jour une autre base, la mise à jour sera effectué toute les 15mn.

    Je cherche à créer un tableau qui aurait cette forme :
    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
    [
      DATE [
        HEURE [
          TABLE [
            ACTION [ 
              PIECE [ 
                LIGNE [ <-- pour certaine table
                  CHAMP:VALEUR
                  (...)
                ]
              ]
            ]
          ]
        ]
      ]
    ]
    Afin d'optimiser les requêtes sql je souhaite grouper les actions, par exemple avec les 3eme lignes du fichier cela donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO squote(SQHNUM) VALUES("DEVHIL21070001");
    UPDATE squote SET QUODAT= 12082021 WHERE SQHNUM = "DEVHIL21070001";
    UPDATE squoted SET QTY = 10 WHERE SQHNUM = "DEVHIL21070001" AND LIGNE = 1000;
    Ce qui donnerait :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    [
      01-07-2021 [
        143707 [
          SQUOTE [
            INSERT [
              DEVHIL21070001 [
                'SQHNUM' : 'DEVHIL21070001'
                (...)
              ]
            ]
          ]
        ]
        143758 [
          SQUOTE [
            UPDATE [
              DEVHIL21070001 [
                'QUODAT' : '12082021'
                (...)
              ]
            ]
          ]
        ]
        144844 [
          SQUOTED [
            UPDATE [
              DEVHIL21070001 [
                1000 [
                  'qty' : 10
                ]
             ]
           ]
        ]
      ]
    ]
    De cette manière j'aurais juste à parcourir le tableau pour reconstruire les requêtes en respectant l'ordre d'exécution (date, heure).

    Ca c'est la théorie mais dans la pratique je n'y arrive pas En php je n'aurais aucun problème mais je ne pige pas la logique avec python. Est-ce faisable, pertinent ?

    Merci d'avance.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par flipflip Voir le message
    Ca c'est la théorie mais dans la pratique je n'y arrive pas En php je n'aurais aucun problème mais je ne pige pas la logique avec python. Est-ce faisable, pertinent ?
    La structure de données que vous essayer de fabriquer ressemble aux structures composites qu'on trouve dans les fichiers JSON.

    Avec Python, çà s'écrit en composant listes et dictionnaires.
    Mais ce sont des structures de données arborescentes pas forcément facile à maîtriser sans avoir acquis les bases du langage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Avec Python, çà s'écrit en composant listes et dictionnaires.
    J'ai fais pas mal de test et lu pas mal de doc mais il doit me manquer un petit détail.

    Avec ce code dans ma boucle de lecture du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(evt == "INSERT"):
        tab = [dat[hou["sorder"["INSERT"[ {col:row[7]} ]]]]]
    J'obtiens le message
    tab = [dat[hou["sorder"["INSERT"[ {col:row[7]} ]]]]]
    TypeError: string indices must be integers

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    L'erreur dit juste que dans "sorder"["INSERT"..., "sorder" est la chaine de caractères, "[" ce qui signale qu'on va l'accéder via ses index... et qu'"INSERT" n'est pas un entier qui pourrait servir d'indice.

    Et si vous ne vous en sortez pas, c'est que vous n'êtes pas familier avec les types de bases. Ce qui se soigne a coup de tuto. et d'exercices pour apprendre à maîtriser.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Salut,

    Je continue dans la compréhension des list python

    J'arrive à ce code qui déjà ne me sort plus d'erreur :
    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
    elif(evt == "INSERT"):
      if not tab:
       # Dans ce cas tab est vide
       # dat = "11-08-2021"
       # hou = "150700"
       # col = itmref
       # row[7] = '0-10418'
        tab.append([dat, [hou, ["sorder", ["INSERT", [ {col:row[7]} ]]]]])
      else:
       # Dans ce cas tab n'est pas vide
       # dat = "11-08-2021"
       # hou = "150700"
       # col = qty
       # row[7] = 10
        tab.insert(0, [dat, [hou, ["sorder", ["INSERT", [ {col:row[7]} ]]]]])
    Le résultat est
    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
    25
     
    [
      [
        '11-08-2021', [
          '150700', [
            'sorder', [
              'INSERT', [
               {'itmref': '0-10418'}
              ]
            ]
          ]
        ]
      ],
      [
      '11-08-2021', [
        '150700', [
          'sorder', [
           'INSERT', [
            {'qty': 10}
           ]
         ]
        ]
      ]
    ]
    ]
    Alors que j'essaie d'obtenir
    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
     
    [
      [
        '11-08-2021', [
          '150700', [
            'sorder', [
              'INSERT', [
               {'itmref': '0-10418'},
               {'qty': 10}
              ]
            ]
          ]
        ]
      ]
    ]

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Avec une liste de listes imbriquées de paires [ a, [ b, [ c, [ d, [....]]]], il faut penser Lisp pour chercher et trouver la liste qui commence par a, b, c et ajouter la différence au même niveau que d. Et ça devrait amener à modifier la représentation pour savoir qui est chainé avec qui...
    => déjà vous avez un soucis de conception.

    Pour le reste pourquoi faire des listes "emboités" plutôt qu'une liste avec [ a, b, c ] comme premier élément (un truc "flat") et la liste des feuilles qui vont avec comme 2ème élément?

    Si on Pythonize, l'ensemble '11-08-2021', '150700', 'sorder', 'INSERT' est un tuple d'immutables qui pourrait être clef d'un dictionnaire associée à une valeur qui serait un objet dictionnaire {'itmref': '0-10418', 'qty': 10}.

    Mais je vous le répète encore, des structures de données composites ne sont simples à maîtriser que si on maîtrise déjà les structures simples. Sinon vous n'allez pas pouvoir concevoir clairement si ce que vous êtes parti à faire va fonctionner et encore moins le faire marcher.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Avec une liste de listes imbriquées de paires [ a, [ b, [ c, [ d, [....]]]], il faut penser Lisp pour chercher et trouver la liste qui commence par a, b, c et ajouter la différence au même niveau que d. Et ça devrait amener à modifier la représentation pour savoir qui est chainé avec qui...
    => déjà vous avez un soucis de conception.
    Je dois avoir aussi un problème de compréhension car je n'ai rien compris à ce que vous essayez de me dire Je sais parfaitement que j'ai des lacunes, je sais parfaitement qu'il faut comprendre la base mais parfois certain projet vont plus loin que la base et l'apprentissage de celle-ci se fait en même temps que des notions plus complexe et c'est aussi un challenge car print "Hello word" on a vu mieux comme défi.

    Si j'essaie tout de même de transposer votre proposition, ma liste de listes imbriqués deviendrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['11-08-2021', '150700', 'sorder', 'INSERT', [ {'itmref':'0-10418'} ]]
    Et si j'ajoute une valeur j'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['11-08-2021', '150700', 'sorder', 'INSERT', [ {'itmref':'0-10418'}, {'qty':'10'} ]]

  8. #8
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Salut,

    Après avoir lu, lu et re-lu de la doc je pense être arrivé au résultat souhaité :

    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
    lines = csv.reader(open(fileSrc, "rb"), delimiter="|")
    for row in lines:
      if not tab:
        # création de la 1ere entrée dans la liste
        tab.append([key])
      else:
        try:
          # Recherche de l'index
          x = [x for x in tab if key in x][0]
          # Ajout du dictionnaire dans l'index de la liste
          tab[tab.index(x)].append({row[6]:row[7]})
        except:
          # l'index n'a pas été trouvé
          # ajout de l'index
          tab.append([key])
          # Recherche de l'index qu'on vient d'ajouter
          x = [x for x in tab if key in x][0]
          # Ajout du dictionnaire dans l'index de la liste
          tab[tab.index(x)].append({row[6]:row[7]})
    C'est un peu brut et il y a sûrement moyen de factoriser tout ça.

    Edit : En plus light

    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
    def searchIndex(tab, key):
      try:
        x = [x for x in tab if key in x][0]
        return x
      except:
        return False
     
    def readFile():
      lines = csv.reader(open(fileSrc, "rb"), delimiter="|")
      for row in lines:
        index = searchIndex(tab, key)
        if(index is False): 
          tab.append([key])
          index = searchIndex(tab, key)
          tab[tab.index(index)].append({col:nval})
        else:
          tab[tab.index(index)].append({col:nval})
     
    def main(argv=None):
      readFile()

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par flipflip Voir le message
    if(index is False)
    Déjà l'emploi des parenthèses est inutile. Mais surtout on ne teste pas les booléens de cette façon car certaines valeurs "considérées" comme True/False ne le sont pas réellement.
    Exemple...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> "ok" if "toto" is True else "bad"
    "bad"
    ... alors que la string "toto" non vide est assimilée au booléen "vrai" mais n'est pas réellement True.
    On peut y arriver via un cast...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> "ok" if bool("toto") is True else "bad"
    "ok"
    ... mais le mieux est de laisser simplement Python traiter l'exression lui-même
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> "ok" if "toto" else "bad"
    "ok"
    => if not index
    Citation Envoyé par flipflip Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (index is False): 
          ...
          ...  
          tab[tab.index(index)].append({col:nval})
        else:
          tab[tab.index(index)].append({col:nval})

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if not index:
          ...
          ...  
    tab[tab.index(index)].append({col:nval})
    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]

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par flipflip Voir le message
    C'est un peu brut et il y a sûrement moyen de factoriser tout ça.
    Vous auriez intérêt à utiliser un dictionnaire (comme je vous l'ai déjà suggéré).

    Après un code comme çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def readFile():
      lines = csv.reader(open(fileSrc, "rb"), delimiter="|")
      for row in lines:
        index = searchIndex(tab, key)
        if(index is False): 
          tab.append([key])
          index = searchIndex(tab, key)
          tab[tab.index(index)].append({col:nval})
        else:
          tab[tab.index(index)].append({col:nval})
    c'est juste illisible!

    L'intention de chercher si quelque chose existe déjà pour y ajouter ... ou le créer.
    Ligne 4, l'instruction index = searchIndex(tab, key) ignore le contenu de la ligne récupérée dans row (et on ne sait pas d'où sort key).

    Pour le reste, comme on ne sait pas ce que sont tab et key... on peut craindre le pire.

    Si çà fonctionne tant mieux pour vous...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  11. #11
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Ligne 4, l'instruction index = searchIndex(tab, key) ignore le contenu de la ligne récupérée dans row (et on ne sait pas d'où sort key).
    Désolé j'ai oublié des lignes dans mon copier/coller (j'ai ajouté la modification if not index proposé par Sve@r)

    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
    25
    26
    27
    28
    29
    30
    31
    def searchIndex(tab, key):
      try:
        x = [x for x in tab if key in x][0]
        return x
      except:
        return False
     
    def readFile():
      tab = []
      lines = csv.reader(open(fileSrc, "rb"), delimiter="|")
      for row in lines:
        dat = row[2]
        hou = row[3]
        nval = row[7]
     
        col = row[6]
        for car in "()":
          col = col.replace(car, "")
     
        (...)
     
        key = dat + '-' + hou + '-' + "sorder" + "-INSERT" + "-" + row[4]
     
        index = searchIndex(tab, key)
        if not index: 
          tab.append([key])
          index = searchIndex(tab, key)
        tab[tab.index(index)].append({col:nval})
     
    def main(argv=None):
      readFile()
    Vous auriez intérêt à utiliser un dictionnaire (comme je vous l'ai déjà suggéré).
    Je ne comprend pas pourquoi utiliser un dictionnaire au lieu d'une liste serait mieux dans mon cas ? Je suis prêt à changer tout mon code mais en l'état, sans plus d'informations de votre part, je ne vois pas ce qui vous dérange. Aider sans donner la réponse je suis pour, mais à un moment il faut donner le minimum pour que les autres comprennes. Les exemples donnés par Sve@r m'ont largement suffit pour comprendre mon erreur et pourtant il ne m'a pas donné la solution toute prête. Si l'objectif de vos interventions est de déblatérer sur des concepts de dev et dénigrer le travail d'un adminSys qui s'essaie à la programmation alors c'est réussi, ou en tout cas c'est mon ressenti.

    Déjà l'emploi des parenthèses est inutile. Mais surtout on ne teste pas les booléens de cette façon car certaines valeurs "considérées" comme True/False ne le sont pas réellement.
    Effectivement c'est mieux ainsi.

  12. #12
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 762
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 762
    Par défaut
    Salut,

    Citation Envoyé par flipflip Voir le message
    Je suis prêt à changer tout mon code mais en l'état, sans plus d'informations de votre part, je ne vois pas ce qui vous dérange. Aider sans donner la réponse je suis pour, mais à un moment il faut donner le minimum pour que les autres comprennes.
    Si on me dit pense à XYZ, ça va t'aider pour ce que tu veux faire... soit je sais ce qu'est XYZ et j'ai déjà réfléchi à cette option et je sais dire pourquoi je ne l'ai pas retenue.

    Soit je n'ai pas trop vu ce que ça peut apporter... et je demande des précisions.

    Comme j'ai déjà écrit:
    Si on Pythonize, l'ensemble '11-08-2021', '150700', 'sorder', 'INSERT' est un tuple d'immutables qui pourrait être clef d'un dictionnaire associée à une valeur qui serait un objet dictionnaire {'itmref': '0-10418', 'qty': 10}.
    pour montrer comment l'utiliser et que ça ne vous interpelle pas plus que ça...

    On est dans l'ignorance de ce que peut être XYZ...
    Pas grave: il y a internet, des tutos, .... pour se documenter et voir ce qu'on pourrait en faire quitte à revenir avec des questions.

    Je pense vous avoir donné un minimum de truc à gratter.
    Après si ça vous passe par dessus la tête, honnêtement ça ne nous empêchera pas de dormir ce soit (ni vous ni moi).

    Citation Envoyé par flipflip Voir le message
    Si l'objectif de vos interventions est de déblatérer sur des concepts de dev et dénigrer le travail d'un adminSys qui s'essaie à la programmation alors c'est réussi, ou en tout cas c'est mon ressenti.
    Là vous manifestez juste un complexe d'infériorité.
    Les dictionnaires (table de hash) sont une des structures de données de base du langage et de la programmation. On peut faire sans... mais c'est dommage.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Bonne nuit alors

    Merci tout de même pour "l'aide".

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par flipflip Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def searchIndex(tab, key):
      try:
        x = [x for x in tab if key in x][0]
        return x
      except:
        return False
    Là il y a encore deux soucis
    1. on essaye d'éviter le "except all" au bénéfice d'un ciblage plus particulier des soucis possibles. Surtout que "except" permet de cibler plusieurs trucs d'un coup via le tuple => except (truc1, truc2, truc3). Ici visiblement tu t'attends soit à avoir un truc, soit à ne pas en avoir et dans ce cas l'indice [0] te renverra un IndexError => except IndexError. Accessoirement peut-être riche d'utiliser un gestionnaire d'exception là où un simple test "tableau vide/tableau non vide" aurait suffi.
    2. plus subtil: que se passe-t-il si ta fonction retourne 0? 0 en Python est assimilé au booléen "False", et donc, à moins de tester explicitement False (ce qui ne se fait jamais), l'appelant ne pourra pas faire la distinction entre "la fonction a trouvé une valeur et l'a retournée" et "la fonction n'a rien trouvé". Si tu dois utiliser une valeur particulière pour "je n'ai pas trouvé" tu peux utiliser None qui est faite pour ça. Et du côté appelant, là lui il pourra tester is/is not None et ça c'est permis et c'est même l'instruction à privilégier pour cette valeur particulière car l'opérateur "is" est le seul qui ne puisse pas être surchargé (personnalisé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def searchIndex(tab, key):
    	x = [x for x in tab if key in x]
    	return x[0] if x else None
    Citation Envoyé par flipflip Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    col = row[6]
    for car in "()":
    	col = col.replace(car, "")
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    col=re.sub("[()]", "", row[6])
    ... mais tu n'es pas obligé de connaitre les regex (enfin pas encore).
    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]

  15. #15
    Membre éclairé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mai 2008
    Messages
    240
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mai 2008
    Messages : 240
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import re
    col=re.sub("[()]", "", row[6])
    Là il y a encore deux soucis

    on essaye d'éviter le "except all" au bénéfice d'un ciblage plus particulier des soucis possibles. Surtout que "except" permet de cibler plusieurs trucs d'un coup via le tuple => except (truc1, truc2, truc3). Ici visiblement tu t'attends soit à avoir un truc, soit à ne pas en avoir et dans ce cas l'indice [0] te renverra un IndexError => except IndexError. Accessoirement peut-être riche d'utiliser un gestionnaire d'exception là où un simple test "tableau vide/tableau non vide" aurait suffi.
    plus subtil: que se passe-t-il si ta fonction retourne 0? 0 en Python est assimilé au booléen "False", et donc, à moins de tester explicitement False (ce qui ne se fait jamais), l'appelant ne pourra pas faire la distinction entre "la fonction a trouvé une valeur et l'a retournée" et "la fonction n'a rien trouvé". Si tu dois utiliser une valeur particulière pour "je n'ai pas trouvé" tu peux utiliser None qui est faite pour ça. Et du côté appelant, là lui il pourra tester is/is not None et ça c'est permis et c'est même l'instruction à privilégier pour cette valeur particulière car l'opérateur "is" est le seul qui ne puisse pas être surchargé (personnalisé)
    Je prends le temps de digérer tout ça et je fais des tests.

    Merci.

Discussions similaires

  1. créer un tableau 2 dimensions avec Malloc
    Par nimportekoi dans le forum C
    Réponses: 14
    Dernier message: 15/11/2006, 13h01
  2. problème avec un tableau à plusieurs dimensions
    Par lelutin dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 07/09/2006, 12h05
  3. Réponses: 3
    Dernier message: 26/05/2006, 19h49
  4. Réponses: 7
    Dernier message: 19/01/2006, 18h57
  5. tableau à plusieurs dimensions
    Par pekka77 dans le forum C
    Réponses: 11
    Dernier message: 07/02/2005, 19h42

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