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 :

Incrémenter nom d'une liste ? encore et toujours !


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 42
    Par défaut Incrémenter nom d'une liste ? encore et toujours !
    Bonsoir. J'ai passé l'après midi à chercher comment je pouvais assigner des valeurs à des noms de listes, mais je suis toujours sans solution

    Je trie des segments et certains sont le point de départ de parcours que je dois reconstituer. J'ai l'idée (peut-être mauvaise) de déclarer une liste pour chaque Vertex (ou segment) susceptible de mener à une solution.
    A chaque fois, le nombre de liste (ou point de départ) est variable (je peux le connaitre) et je voudrais donner à chaque liste une nom adapté.

    Comment faire pour indexer le nom d'une liste ? Dois-je passer par un dictionnaire ? Je dois pouvoir ajouter d'autres segments ordrés à la liste ouverte de façon à créer un parcours
    J'ai vu des idées de solutions reprenant locals()[name]=value mais je ne les ai pas bien comprise...
    Dois-je chercher du coté de eval ou exec ?

    C'est un sujet souvent traité mais à par les solutions de cellules adaptées à Matlab, je ne vois pas

    Une bonne âme pour me mettre sur la piste ?
    Merci d'avance

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Si je comprends bien, au début de ton programme tu détermines que tu as 3 chemins possibles. Pour la suite, tu souhaiterai avoir donc 3 variables chemin_1, chemin_2 et chemin_3 ? C'est ça ?

    Si non, merci de montrer un exemple du code que tu souhaites obtenir.

    Si oui, il me semble que ce n'est pas possible. De plus, je ne vois pas du tout ça quoi ça te servirait car tu ne peux écrire de code utilisant des variables que tu ne connais pas. En revanche, si tu souhaites avoir un nom associé à chaque possibilité, un dictionnaire peut très bien faire l'affaire. Voici un exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    nb_solutions = 3 # tu recuperes 3 comme tu veux
     
    chemins = dict()
    for i in range(0, nb_solutions):
        vertex = list() # tu mets tes segments dans la liste
        nom = "chemin_" + str(i)
        chemins[nom] = vertex
     
    print(chemins)
    print(chemins["chemin_1"])

  3. #3
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 42
    Par défaut
    Merci Bktero,

    Je ne sais pas comment faire pour poster du code sur le forum ! ... Hou !! La honte

    Je fais du traitement de fichier .DXF
    Lors d'un traitement, je sors un certain nombre de segments (droites/arc/ellipse...)
    En théorie, je ne sais pas avant combien je vais en avoir. Une fois ce premier traitement fait, je connais le nombre.
    J'appelle ces segments le début de mes chaînes.

    Je souhaite ensuite faire d'autres traitements des milliers de segments et les rattacher à la bonne chaîne (d'où l'idée de Liste)

    Je peux donc avoir 0, 4 ou 80 chaînes à constituer (et donc 80 listes).... D'où l'idée de pouvoir les "indexer" ?

    Non ? Je ne suis certainement pas le premier confronter à ce type de truc ? CAN'T ASSIGN TO OPERATOR
    Quelle est la méthode à suivre ? Peut-on ajouter des cellules à un tableau Matlab ?

    Merci sincèrement pour le temps que vous m'accordez.

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Il y a un bouton en forme de # dans l'outil de rédaction de message. Il rajoute des balises spéciales pour mettre en forme du code : [CODE][/CODE] (j'ai utilisé une autre balise spéciale pour que les balises CODE s'affichent). Il te suffit de mettre ton code entre ces balises. Au final, tu as ce que j'ai dans mon message précédent.

    Si tu souhaites indexer des listes, il suffit d'avoir une liste de listes. Tu auras un code comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    nb_solutions = 3 # tu recuperes 3 comme tu veux
     
    chemins = list()
    for i in range(0, nb_solutions):
        vertex = list() # tu mets tes segments dans la liste
        chemins.append(vertex)
     
    print(chemins)
    print(chemins[0])

  5. #5
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 42
    Par défaut
    Bon ... Je suis entre pantois et médusé ...
    Merci Bktero pour cette solution triviale et qui devrait me sortie du puits dans lequel je me suis poussé.

    Je vais mettre ça en place cette nuit

  6. #6
    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
    Citation Envoyé par Bktero Voir le message
    Si je comprends bien, au début de ton programme tu détermines que tu as 3 chemins possibles. Pour la suite, tu souhaiterai avoir donc 3 variables chemin_1, chemin_2 et chemin_3 ? C'est ça ?

    Si oui, il me semble que ce n'est pas possible.
    Ça l'est, mais c'est tout à fait inadéquate et surtout une mauvaise pratique... comme tu le dis si bien après avec

    Citation Envoyé par Bktero Voir le message
    De plus, je ne vois pas du tout ça quoi ça te servirait car tu ne peux écrire de code utilisant des variables que tu ne connais pas.

  7. #7
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 42
    Par défaut
    J'ai bien compris que ce n'était pas la bonne pratique, mais je ne suis pas de la partie (vous l'aurez compris) et le reflex est de faire ainsi...

    Quel est donc, svp, la philosophie à adopter ?
    La solution que me donne Bktero ne me permet pas d'identifier les listes créées.
    J'ai un ordre de création, mais je trouverai plus simple de leur attribuer un nom lui même issu de mon process ... Non ?

    Peut-être qu'avec l'expérience j'abandonnerai cette façon de vouloir ordonner les résultats ?

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    @fred1599 : ça m'intéresse de voir comment on fait, ça peut servir

    @massaproduxy : tout dépend de ce que tu entends par identifier. Dans ma première solution, les clés du dictionnaire sont des chaines identifiant tes listes de segments. Dans la seconde solution, les indices de la liste de listes sont des entiers qui jouent le même rôle. Si tu veux faire que tes possibilités soient ordonnées, la solution 2 semble meilleure, puisque les entiers garantissent un ordre. Ca peut aussi marcher avec la solution 1 mais cela du format de tes clés et les comparaisons de chaines sont bien plus couteuses que les comparaisons d'entiers.

    On peut imaginer une 3e solution hybride :
    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
    nb_solutions = 3
     
    chemins = list()
    for i in range(0, nb_solutions):
        nom = "chemin_" + str(i)
        vertex = list()
     
        element = tuple([nom, vertex])
     
        chemins.append(element)
     
    print(chemins)
    print(chemins[0])
    print(chemins[0][0])
    print(chemins[0][1])
    Résultat :
    [['chemin_0', []], ['chemin_1', []], ['chemin_2', []]]
    ['chemin_0', []]
    chemin_0
    []
    Tu as désormais une liste de tuples. Un tuple contient un nom et une liste de segments.

  9. #9
    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
    Citation Envoyé par Bktero Voir le message
    @fred1599 : ça m'intéresse de voir comment on fait, ça peut servir
    Bof, mais si tu insistes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    vars_names = ('foo', 'bar', 'baz')
     
    for ind, name in enumerate(vars_names):
        vars()[name] = ind # équivalent à variable = valeur à partir d'une chaîne de caractères
     
    print(foo) # foo est une variable, comme bar et baz ci-dessous, ici foo vaut 0
    print(bar) # bar vaut 1
    print(baz) # ...
    Mais comme déjà dis, mieux vaut expliquer un problème et avoir une solution viable et algorithmique, que de partir vers une solution où l'on utilise des mauvaises pratiques et non maintenable.

  10. #10
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 754
    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 754
    Par défaut
    Citation Envoyé par massaproduxy Voir le message
    Quel est donc, svp, la philosophie à adopter ?
    La solution que me donne Bktero ne me permet pas d'identifier les listes créées.
    J'ai un ordre de création, mais je trouverai plus simple de leur attribuer un nom lui même issu de mon process ... Non ?
    Un nom vous donne le moyen d'accéder au n-ième chemin N via la variable chemin_n.
    Avec une liste de listes, ce sera chemins[n].

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

  11. #11
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 838
    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 838
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par massaproduxy Voir le message
    Quel est donc, svp, la philosophie à adopter ?
    Bonjour
    La philosophie de base, c'est que si on doit gérer n "trucs" alors on passe par un tableau de trucs. En python, un tableau se nomme une "liste" (ou éventuellement "tuple" si tu n'as pas besoin de modifier son contenu).
    Exemple de liste de trucs: tabTruc=[truc(), truc(), truc()].
    C'est en effet plus simple de traiter les trucs en les itérant...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    tabTruc=[truc(), truc(), truc()]
    for t in tabTruc: print t
    for i in xrange(len(tabTruc)): print i, tabTruc[i]
    for (i, t) in enumerate(tabTruc): print i, t
    ...que d'écrire
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    truc1=truc()
    truc2=truc()
    truc3=truc()
    print "truc1: ", truc1
    print "truc2: ", truc2
    print "truc3: ", truc3
    (même en utilisant l'astuce de fred1599 ça reste galère).

    Citation Envoyé par massaproduxy Voir le message
    J'ai un ordre de création, mais je trouverai plus simple de leur attribuer un nom lui même issu de mon process ... Non ?
    Plus simple ça dépend. Chaque outil a des avantages et des inconvénients. A toi de les connaitre pour choisir celui qui se prêtera le mieux à ton besoin. Mais pour moi utiliser l'ordre de création pour ordonner les résultats n'est pas rédhibitoire (les listes et les tuples te garantissent cet ordre donc si tu as une garantie, alors tu as le droit de l'utiliser).

    Sinon tu peux remplacer une liste par un dictionnaire. La différence c'est que là l'accès aux éléments se fait ensuite par clefs et non par indices.
    Exemple de dictionnaire de trucs: dicTruc={"prems" : truc(), "second" : truc(), "third" : truc()} puis tu récupères l'élément "k" en demandant dicTruc[k] (k à choisir entre "prems", "second" et "third").
    Tu peux cependant toujours itérer sur les dictionnaires. Tu peux itérer sur la liste des clefs du dictionnaire en demandant dictTruc.viewkeys(), la liste des valeurs du dictionnaire en demandant dictTruc.viewvalues(), et la liste des couples clefs+valeurs en demandant dictTruc.viewitems(). Mais l'ordre de récupération n'est plus du tout garanti et donc rien ne peut te dire si tu auras "prems" avant ou après "second" (ni même si l'ordre à un instant "t1" restera le même à un autre instant "t2").

    Toutefois en utilisant les collections, tu peux alors avoir des dictionnaires avec ordre garanti. Je ne te dis pas que je m'en suis jamais servi mais chaque fois que je m'en suis servi, c'était par fainéantise. Je trouvais plus agréable d'avoir un élément accessible par un nom tout en sachant que l'élément [n-1] serait récupéré avant l'élément [n] (c'était pour une liste de colonnes à afficher dans une grille) mais j'aurais pu aussi utiliser un tuple et accéder à elem[n] plutôt que elem[k] (dans ce cas précis l'ordre était primordial et l'accès par clef plutôt que par indice était plaisant mais restait facultatif).
    Exemple de dictionnaire ordonnés de trucs: dictOrderTruc=collections.OrderedDict((("prems", truc()), ("second", truc()), ("third", truc()))) (le reste sans changement par rapport aux dicos de base).

    Citation Envoyé par massaproduxy Voir le message
    Peut-être qu'avec l'expérience j'abandonnerai cette façon de vouloir ordonner les résultats ?
    Cela ne dépend pas de toi mais de ton besoin et ça dépendra de chaque projet. C'est d'ailleurs pour ça qu'on a autant d'outils (trop peut-être ?)...
    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]

  12. #12
    Membre actif
    Homme Profil pro
    Etudiant
    Inscrit en
    Mars 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Etudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2016
    Messages : 42
    Par défaut Merci
    Je ne pensais pas que ma question serait traitée par autant de visions et solutions: Merci à vous.
    Je vais tout relire pour bien comprendre, mais soyez certain que j'ai globalement compris la leçon.

Discussions similaires

  1. Passage en paramétre dans une url du nom d'une liste
    Par lesanglier dans le forum SharePoint
    Réponses: 1
    Dernier message: 16/11/2009, 14h59
  2. Ajouter des noms dans une liste déroulante
    Par Unreal Time dans le forum IHM
    Réponses: 1
    Dernier message: 13/11/2009, 15h02
  3. Aide [C++] Logiciel traitant le nom d'une liste de fichiers
    Par Sound4Lyon dans le forum Mon programme
    Réponses: 0
    Dernier message: 11/11/2008, 23h43
  4. [Excel] Supprimer le nom d'une liste
    Par lucarno dans le forum Excel
    Réponses: 4
    Dernier message: 12/03/2008, 10h05
  5. nom d'une liste à partir de valeurs de variables
    Par pedro99 dans le forum Général Python
    Réponses: 5
    Dernier message: 27/06/2007, 17h54

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