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 :

Utilisation join sur une liste imbriquée


Sujet :

Python

  1. #21
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    pas compris si c'est le champ qui manque ou qu'il manque une valeur ...

    Voici un modèle qui lui est très souple :
    nombre de (double) champ de 1 a 12
    Récupére uniquement si "parcelle/date" existe et est non vide
    en plus, ne récupère pas les 2 champs, si "remarque" n'existe pas ou vide

    note, dans code : d = date, r = remarque (noms des champs)
    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
    35
    36
    37
    38
    39
    KEYS = "parcelle", "remarque"     # a modifier
     
    # le pire des cas ?
    e = {
        "parcelle1": "A",
        "remarque1": "avance ....",
        "parcelle2": "B",
        "remarque2": "bon ....",
        "parcelle3": "",           # date vide ???
        "remarque3": "",
        "parcelle4": "D",
        "remarque4": "ok ....",
        "parcelle5": "E",
        "remarque5": "fin demain ....",
        "parcelle6": "F",
        "remarque6": "",         # pas de remarque (donc on affiche pas  ?)
        "parcelle7": "X",
        # "remarque7": "",      # champ existe pas
        "remarque8": "Bug",   # du grand n'importe quoi : sans "date"  !
    }
     
     
    def filtre_travaux(e) -> list:
        champs = e.keys()  # e.fields() avec GIS
        keys = ((f"{KEYS[0]}{i}", f"{KEYS[1]}{i}") for i in range(1, 12) if f"{KEYS[0]}{i}" in champs)
        # print("  # recup only:", keys)  # si non générateur mais list
        return [f"{e[d]:10} : {e[r]}" for d, r in keys if e[d] and r in champs and e[r]]
     
     
    travaux = filtre_travaux(e)
    print(len(travaux), "travaux avec remarque")
    print()
    if len(travaux) > 0:
        print("-" * 12)
        print("\n".join(travaux))
        # self.dlg.tavauxListe.setText("\n".join(travaux))
    else:
        ...
        # self.dlg.tavauxListe.setText("rien en cours")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    4 travaux avec remarque
     
    ------------
    A          : avance ....
    B          : bon ....
    D          : ok ....
    E          : fin demain ....
    ----------------
    note
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    KEYS = "parcelles_Travaux_Date", "parcelles_Travaux_Travaux"
    # ou plus logique # CHAMP_DATE, CHAMP_REMARQUE = "parcelles_Travaux_Date", "parcelles_Travaux_Travaux"
    en "constante" globale, puisque je suppose que tu réutilises autre part dans le code ces noms

  2. #22
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Citation Envoyé par papajoker Voir le message
    Tu ne lis toujours pas la doc (si ca fonctionne pourquoi perdre du temps à comprendre ...)

    Existe 36 façons de contourner ton problème, c'est a toi d'essayer

    - build_travaux_remarques(e.attributeMap()) # avec des e.get a l'intérieur
    - for i in range(1,7): key = f"parcelle{i}" ... key = f"remarque{i}" ; if key in ...
    - def get_valeur(e, key): try except ... [ getvaleur(e, field]) for field in fields...
    - [e[field] for field in fields if field in e.fields()] # a adapter/modifier
    - ...

    ------------
    Et comme déjà écrit, ton tableau de constantes est une horreur (mais cela ne te dérange pas ),
    un exemple de remplacement (si tableau est véritablement utile...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    KEYS = "parcelle", "remarque"
    champs = ("parcelle2", "parcelle4", "parcelle8")  # e.fields()
    keys = [(f"{KEYS[0]}{k}", f"{KEYS[1]}{k}") for k in range(1, 12) if f"{KEYS[0]}{k}" in champs]
    print(keys)
    et ici, la fonction va être ok avec une ou 12 parcelles
    Je vais corriger ma structure de tableaux, je comprends bien que c'est un peu fouilli. En utilisant ce code je dois pouvoir y ajouter une boucle for in range sur la valeur champs ? Je vais essayer

  3. #23
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Dans ma table attributaire (qui provient de e) j'ai sur cet aspect travaux 3 champs : date, travaux et remarque. 6 champs que je nomme (date1, travaux1, remarque1; date2...). J'affiche les premiers éléments dans un dlg (date et travaux) et pour ceux ci pas de problème car si il y a une date travaux est rempli et inversement.
    C'est effectivement dans le second dlg que j'affiche où il peut y avoir le champ date mais pas de remarque. L'inverse ne peut être vrai. Mais bon qui peut le plus peut le moins.

    Concernant la structure de mes tables (que je modifierai à la fin), voici ce que j'ai fait, il me reste juste à trouver pour supprimer les (). Es ce que cela vous parait correct ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i in range(1,7):
        print(i)
        dat = "date"+ format(i)
        rq = "remarque"+ format(i)
        KEYS = dat,rq
        mon_tab.append(KEYS)
    print (mon_tab)

  4. #24
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    Es ce que cela vous parait correct ?
    Il y a plein de façons de coder la construction d'une liste avec python. Du coup, ce que vous faites est "correct" si ça fonctionne (ce qui suppose aussi que ça fait ce que vous cherchiez à faire).

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

  5. #25
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Il y a plein de façons de coder la construction d'une liste avec python. Du coup, ce que vous faites est "correct" si ça fonctionne (ce qui suppose aussi que ça fait ce que vous cherchiez à faire).

    - W
    Oui cela me créé bien une table qui correspond à celle que j'ai écris manuellement, sauf les () à chaque couple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [('date1', 'remarque1'), ('date2', 'remarque2'), ('date3', 'remarque3'), ('date4', 'remarque4'), ('date5', 'remarque5'), ('date6', 'remarque6')]

  6. #26
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    [QUOTE=papajoker;12079275]pas compris si c'est le champ qui manque ou qu'il manque une valeur ...

    Voici un modèle qui lui est très souple :
    nombre de (double) champ de 1 a 12
    Récupére uniquement si "parcelle/date" existe et est non vide
    en plus, ne récupère pas les 2 champs, si "remarque" n'existe pas ou vide

    note, dans code : d = date, r = remarque (noms des champs)
    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
    35
    36
    37
    38
    39
    KEYS = "parcelle", "remarque"     # a modifier
     
    # le pire des cas ?
    e = {
        "parcelle1": "A",
        "remarque1": "avance ....",
        "parcelle2": "B",
        "remarque2": "bon ....",
        "parcelle3": "",           # date vide ???
        "remarque3": "",
        "parcelle4": "D",
        "remarque4": "ok ....",
        "parcelle5": "E",
        "remarque5": "fin demain ....",
        "parcelle6": "F",
        "remarque6": "",         # pas de remarque (donc on affiche pas  ?)
        "parcelle7": "X",
        # "remarque7": "",      # champ existe pas
        "remarque8": "Bug",   # du grand n'importe quoi : sans "date"  !
    }
     
     
    def filtre_travaux(e) -> list:
        champs = e.keys()  # e.fields() avec GIS
        keys = ((f"{KEYS[0]}{i}", f"{KEYS[1]}{i}") for i in range(1, 12) if f"{KEYS[0]}{i}" in champs)
        # print("  # recup only:", keys)  # si non générateur mais list
        return [f"{e[d]:10} : {e[r]}" for d, r in keys if e[d] and r in champs and e[r]]
     
     
    travaux = filtre_travaux(e)
    print(len(travaux), "travaux avec remarque")
    print()
    if len(travaux) > 0:
        print("-" * 12)
        print("\n".join(travaux))
        # self.dlg.tavauxListe.setText("\n".join(travaux))
    else:
        ...
        # self.dlg.tavauxListe.setText("rien en cours")
    J'ai donc repris le code mais il me donne systématiquement rien en cours... J'ai encore du passé à côté de quelque chose. Mais quelque soit ou je clique j'ai toujours len(travaux) = 0
    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
                def filtre_travaux(e) -> list:
                    fields = [
                            'parcelles_Travaux_Date1','parcelles_Travaux_Remarque1',
                            'parcelles_Travaux_Date2','parcelles_Travaux_Remarque2',
                            'parcelles_Travaux_Date3','parcelles_Travaux_Remarque3',
                            'parcelles_Travaux_Date4','parcelles_Travaux_Remarque4',
                            'parcelles_Travaux_Date5','parcelles_Travaux_Remarque5',
                            'parcelles_Travaux_Date6','parcelles_Travaux_Remarque6'
                            ]
                    print("fields:",fields)
                    champs = e.fields()  # e.fields() avec GIS
                    print(champs)
                    keys = ((f"{KEYS[0]}{i}", f"{KEYS[1]}{i}") for i in range(1, 12) if f"{KEYS[0]}{i}" in champs)
                    print("keys:",keys)
                    #print("  # recup only:", keys)  # si non générateur mais list
                    return [f"{e[d]:10} : {e[r]}" for d, r in keys if e[d] and r in champs and e[r]]
                travaux = filtre_travaux(e)
                print("lgt:",len(travaux), "Pas de remarques")
                print()
                print(filtre_travaux(e))
                if len(travaux) > 0:
                    print("-" * 12)
                    print("trav:","\n".join(travaux))
                    self.dlg.travauxRq.setText("\n".join(travaux))
                else:
                    ...
                    self.dlg.travauxRq.setText("rien en cours")

  7. #27
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    Oui cela me créé bien une table qui correspond à celle que j'ai écris manuellement, sauf les () à chaque couple.
    A partir du moment où vous avez fait de KEYS un tuple (en écrivant KEYS = dat,rq), on va retrouver ce tuple dans la liste (mon_tab.append(KEYS) ajoute ce tuple à la liste...). Pour ajouter les items du tuple (sans les ()), on peut utiliser extend (à la place de append).
    Accessoirement, listes, dictionnaires, ... sont des structures de base du langage qu'on essaie de maîtriser avant de se lancer dans de petits projets (sinon on va vite être paumé...).
    Et plus généralement, lorsque vous demandez de l'aide pour mettre au point un bout de code, poster ce qu'il faut pour reproduire le problème (comme vous débutez, ce qui vous paraît important ne l'est peut être pas...)

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

  8. #28
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    me donne systématiquement rien en cours... J'ai encore du passé à côté de quelque chose. Mais quelque soit ou je clique j'ai toujours len(travaux) = 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                def filtre_travaux(e) -> list:
                    champs = e.fields()  # e.fields() avec GIS
                    print(champs)
    Nous ne sommes pas dans ta machine
    si tu ne retourne pas le résultat du print, je donne ma langue au chat (pas le numérique à la mode), et si pas bon voir dans la doc si existe une autre méthode... j'espère que tu as compris que le but est de récupérer les noms des champs/attributs? de ton objet "e"
    Et tu ne donnes même pas le contenu de KEYS (comme si cela n'avait pas d'importance)
    Et pourquoi encore avoir ton tableau "fields" ? j'ai peur que tu ne comprennes pas une ligne de ce code.
    Si tu ne comprends rien, autant l'écrire toi même, au moins, tu vas tout maitriser d A à Z.

    A noter que maintenant tu as une triplette, donc il faut surement ajuster. Mais il n'y a que toi qui connait réellement ton cachier des charges.

    J'ai du mal à te suivre, dans ton tout premier code tu utilises une compréhensions de liste, et maintenant tu ne sembles même pas connaitres les listes..tuples (message #23)

  9. #29
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    print (keys) # donne <generator object CoordClick.display_point.<locals>.filtre_travaux.<locals>.<genexpr> at 0x000001F01A5CC660>
    print("lgt:",len(travaux), "Pas de remarques") # donne 0, pas de remarques
    print() # donne []


    Effectivement j'ai du mal à saisir les différents aspects et différences, je me suis lancé dans la création de ce plugin et je ne connaissais pas du tout python, donc je me rend bien compte de toutes les subtilités et je suis un peu perdu, même si j'ai compris des choses. Je pense que j'ai été un peu trop gourmand n'ayant pas les bases, mais je n'ai pas envie de lâcher.
    Pour ma liste je n'ai pas voulu faire de changements avant que la partie actuelle soit fonctionnelle, je viens de le faire. J'espère ne pas avoir fait une nouvelle erreur

    En tout cas le print(keys) ne semble pas donner le résultat attendu. Je vais chercher la raison.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     KEYS = "parcelles_Travaux_Date", "parcelles_Travaux_Remarque"
     
                def filtre_travaux(e) -> list:
     
                    champs = ('parcelles_Travaux_Date1','parcelles_Travaux_Date2','parcelles_Travaux_Date3','parcelles_Travaux_Date4',
                              'parcelles_Travaux_Date5','parcelles_Travaux_Date6') # e.fields() avec GIS

  10. #30
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Marcopololo Voir le message
    print (keys) # donne <generator object CoordClick.display_point.<locals>.filtre_travaux.<locals>.<genexpr> at 0x000001F01A5CC660>

    Effectivement j'ai du mal à saisir les différents aspects et différences
    Si un élément ne convient pas, tu peux alors le convertir en un autre qui te conviendra. Comme tous les éléments sont tous de même nature (ie des "itérables", c'est à dire des ensembles pouvant subir une itération), ils sont tous convertibles les uns dans les autres.
    Exemple: print(range(10)) te donnera range(0, 10), c'est à dire "ceci est un objet range". Si maintenant tu veux le "résultat" issu de cet objet, tu peux alors le convertir en tuple => print(tuple(range(10))) qui donnera cette fois (0, 1, 2, 3, 4, 5, 6, 7, 8, 9).
    => print(tuple(keys).

    Citation Envoyé par Marcopololo Voir le message
    je me suis lancé dans la création de ce plugin et je ne connaissais pas du tout python
    Mouais. Tu te lancerais dans le Vendée Globe sans connaître la voile ? Ce n'est pas parce qu'un truc est virtuel qu'il ne demande pas des connaissances et des bases.
    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]

  11. #31
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Mouais. Tu te lancerais dans le Vendée Globe sans connaître la voile ? Ce n'est pas parce qu'un truc est virtuel qu'il ne demande pas des connaissances et des bases.
    C'est vrai, mais je prends moins de risques, bon c'est vrai j'embête un peu, mais c'est une fâcheuse habitude chez moi, je me lance et j'avance. Et j'avoue que grâce à vous j'ai déjà pas mal appris

  12. #32
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Effectivement, mon code ne peut fonctionner avec un générateur puisque il est utilisé 36 fois.
    Et tu ne dis même pas si la convertion donnée par Sve@r fonctionne Comme déjà écrit, nous ne sommes pas dans ta machine .

    Mais bon, essayer de récupérer mon code sans rieny comprendre n'est pas une bonne idée.

  13. #33
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    Et j'avoue que grâce à vous j'ai déjà pas mal appris
    Avec un tutoriel tu aurais appris plus en moins de temps. Accessoirement (et c'est la remarque de papajoker qui m'y a fait penser), un générateur n'est utilisable qu'une seule fois.
    Code pytjon : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> a=(x for x in range(5))
    >>> type(a)
    <class 'generator'>
    >>> tuple(a)
    (0, 1, 2, 3, 4)
    >>> tuple(a)
    ()
    Donc même si ton print() fonctionne, cela ne garantit pas la réussite.

    La solution (dans le cas où un générateur doit être utilisé plusieurs fois): le placer dès le départ dans un container durable (ie un tuple).
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> a=tuple(x for x in range(5))
    >>> a
    (0, 1, 2, 3, 4)
    >>> a
    (0, 1, 2, 3, 4)
    >>> a
    (0, 1, 2, 3, 4)
    >>>
    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]

  14. #34
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    En supposant que batched retourne l'erreur: "ValueError: not enough values to unpack...", on peut se retrouver avec un nombre "impair" d'items difficiles à regrouper par 2.
    La même structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        items2 = [e[field] for field in fields if e[field]]
        str3 = '\n'.join(f'{a} : {b}' for a, b in list(batched(items2, 2)))
    peut être "compactée" en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        str3 = '\n'.join(f'{e[a]} : {e[b]}' for a, b in batched(fields, 2) if e[b])
    - W
    Merci beaucoup, cela fonctionne, je vais maintenant m'attacher à mettre en œuvre tout vos conseils. Étonnamment le code compacté fonctionne mais pas celui sur deux lignes.

  15. #35
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    Étonnamment le code compacté fonctionne mais pas celui sur deux lignes.
    A vous de prendre le temps d'essayer de comprendre pourquoi...

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

  16. #36
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Je voulais juste montrer l'évolution de mon code en supprimant ces tables qui donnaient des boutons à papajoker. J'imagine que ce n'est pas parfait pas c'est effectivement moins lourd, du moins j'espère. Je n'ai pas encore creusé mais je pense que l'on peut comprimer les variables dat et format dans un key. Et la dernière étape sera de mettre des noms de champs moins complexes.

    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
                def build_travaux_dates(e):
     
                    global str2
     
                    mon_tab = []
     
                    for i in range(1, 7):           #création liste des dates et remarques du display_point
                        dat = "parcelles_Travaux_Date" + format(i)
                        rq = ("parcelles_Travaux_Travaux") + format(i)
                        keys = [dat, rq]
                        mon_tab.append(keys)
                        fields = sum(mon_tab,[])
                        str2 = '\n'.join(f'{e[a]} : {e[b]}' for a, b in batched(fields, 2) if e[b])  # contrôle présence champ remarque si date existe et concatenation champ date et travaux
                    if not str2:
                        return 'Aucun travaux effectués ici...'
                    return str2
                self.dlg.travauxListe.setText(build_travaux_dates(e))
    Et pour wiztricks je pense avoir compris que le code compacté fait appel directement aux champs un par un et permet donc de vérifier qu'ils sont bien présents

    encore merci à vous

  17. #37
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 064
    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 064
    Par défaut
    Hello,

    Vous avez global str2 dans une fonction qui retourne déjà str2, pour moi c'est un problème de conception.

  18. #38
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 753
    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 753
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    Et pour wiztricks je pense avoir compris que le code compacté fait appel directement aux champs un par un et permet donc de vérifier qu'ils sont bien présents
    Vu le code que vous avez posté, j'en suis pas si sûr!
    Relisez votre code: ligne 11 mon_tab contient une liste de listes à 2 éléments (à la place de tuples du coup précédents.
    Ligne 12, vous utilisez l'astuce sum pour "aplatir" la liste. Elle devient liste simple.
    Ligne 13, le batched refabrique le groupage en 2 éléments que vous venez juste de défaire...

    De plus il n'y a aucun intérêt à avoir ces deux dernières lignes dans le corps de la boucle.

    Tout cela se résumerait à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template = 'date{n} / travaux{n}' 
    mon_tab = [ template.format(n=i).split('/') for i in range(1, 7) ]
    str2 = '\n'.join(f'{e[a]} : {e[b]}' for a, b in mon_tab if e[b])
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  19. #39
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    Citation Envoyé par Marcopololo Voir le message
    J'imagine que ce n'est pas parfait
    Ton code est un bon début (bien que faut) :
    Ta fonction n'est pas critique (en temps), tu peux donc utiliser ce que tu connais et ne pas utiliser de compréhensions de liste et plutôt utiliser des boucles "for".

    note: la compréhension de liste avec batched() existait uniquement que parce que tu avais déclaré un tableau dans une structure particulière et qu'il fallait ensuite changer cette structure pour faire l'extraction des données.
    Dans mon code exemple, je n'utilise pas batched() car j'ai directement créé une structure compatible avec l'extraction
    wiztricks te donne une solution "sans", à toi de l'écrire avec un (ou des) "for" pour qu'elle soit bien compréhensible pour toi

  20. #40
    Membre éclairé Avatar de Marcopololo
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 311
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Hello,

    Vous avez global str2 dans une fonction qui retourne déjà str2, pour moi c'est un problème de conception.
    Au départ je ne l'avais pas mise en global, je n'aurais pas dû écouter les recommandations de Pycharm....

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. Utiliser AVG pour un calcul sur une liste d'entité
    Par VirgApps dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/10/2014, 14h46
  2. Utiliser le double clic sur une liste dans HTA
    Par papyxy dans le forum VBScript
    Réponses: 3
    Dernier message: 06/07/2014, 09h14
  3. Utiliser LEFT JOIN sur une grosse base de données
    Par bractar dans le forum Requêtes
    Réponses: 20
    Dernier message: 11/01/2014, 07h32
  4. Réponses: 2
    Dernier message: 08/09/2011, 09h07
  5. Réponses: 7
    Dernier message: 18/04/2006, 17h44

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