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 :

Pb de suppression de liste


Sujet :

Python

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut Pb de suppression de liste
    Bonjour,

    Je pensais que cette étape allais être facile, je galère :
    J'ai une liste "gens" avec des listes a l'intérieur j'ai indiqué n'importe quoi dedans pour mes tests :
    renvoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[1, '01', 'dfsdfd', 'fsdf', '', 'Non'], [1, '01', 'encore 1', 'fghfg', '', 'Non'], [2, '02', 'le 2', '222', '', 'Non'], [1, '01', 'sdfds', 'sd', '', 'Non']]
    Je voudrais recrée cette liste voire une autre liste en retirant celles qui commencent par 1 soit :
    [1, '01', 'dfsdfd', 'fsdf', '', 'Non']
    [1, '01', 'encore 1', 'fghfg', '', 'Non']
    [1, '01', 'sdfds', 'sd', '', 'Non']


    Il ne doit donc rester que celle-ci :
    [2, '02', 'le 2', '222', '', 'Non']

    J'ai fait cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        print(gens)
        for e in enumerate(gens):
            if e[1][0] == 1:
                print("a sup")
                gens.remove[1]
            else:
                print("non")
        print(gens)
    Ca me renvoi ce msg d'erreur :
    TypeError: 'builtin_function_or_method' object is not subscriptable


    Il n'a donc rien retiré pourtant si je retire :
    cela distingue bien ("A sup" ou "non") celles qu'il faut retirer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [[1, '01', 'dfsdfd', 'fsdf', '', 'Non'], [1, '01', 'encore 1', 'fghfg', '', 'Non'], [2, '02', 'le 2', '222', '', 'Non'], [1, '01', 'sdfds', 'sd', '', 'Non']]
    a sup
    a sup
    non
    a sup
    [[1, '01', 'dfsdfd', 'fsdf', '', 'Non'], [1, '01', 'encore 1', 'fghfg', '', 'Non'], [2, '02', 'le 2', '222', '', 'Non'], [1, '01', 'sdfds', 'sd', '', 'Non']]

    Je comprends pas comment faire.

  2. #2
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Ah oui !

    Ce code est dans une fonction que j'appelle via un menu tkinter

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Bonjour

    la fonction remove supprime de la liste la valeur indiquée en paramètre
    Or ta variable gens est une liste de liste; elle ne contient pas la valeur 1
    D'ailleurs, tu veux supprimer toutes la liste et non juste une valeur

    PS, le enumerate me parait inutile ici

  4. #4
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour,

    Merci pour ta réponse, c'est justement mon problème, je ne sais pas comment supprimer ces 3 listes en ne gardant que la liste dont l'index est 2.
    En fait j'ai 6 listes (1,2,3,4,5 et 6) qui pointent sur cette unique liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gens = [[1, '01', 'dfsdfd', 'fsdf', '', 'Non'], [1, '01', 'encore 1', 'fghfg', '', 'Non'], [2, '02', 'le 2', '222', '', 'Non'], [1, '01', 'sdfds', 'sd', '', 'Non']]
    Mon problème est que je veut retirer les listes 1 si je choisi 1, la liste 2 si je choisi de supprimer celles dont l'index est 2 ect...

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Tu n'es vraiment pas loin du but

    Pose toi la question de savoir ce que fais cette instruction
    Normalement j'y ai déjà répondu mais mes explications peuvent être insuffisante, je le conçois


    Puis demande toi comment récupérer tout la liste et non juste un élement. Ca devrait être simple
    Petit (Gros) indice : quel est le type de e[1] dans ton code ?

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    remove n'est pas la bonne fonction à utiliser.

    Et même si vous utilisiez la bonne, ca poserait encore des problèmes car vous effaceriez des éléments d'une liste sur laquelle vous etes en train d'itérer (donc vous la modifiez avant même que vous n'ayez fini de la parcourir).

    Sinon, plus simple est de construire une nouvelle liste qui ne contient que les éléments intéressants. Vous l'initialiser à liste vide. Vous parcourez la 1ere liste. Pour chaque gens vous regarder si le 1er élément est un 1. Si s'en est pas un, vous pouvez l'ajouter à la nouvelle liste. Et dans votre nouvelle liste vous aurez ce qu'il faut.

  7. #7
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour,

    e[1] est de type list et e[1][0] est de type integer, normal comme tu l'a dit il ne prend que l'élément.

    je pense que je vais créer une liste intermédiaire comme me le suggère lg_53.

    Merci a vous deux.

    Pour mon info personnelle si je ne voulait pas créer une nouvelle liste intermédiaire, j'aurais fait comment ?

  8. #8
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    enumerate retourne un tuple avec l'index de l'élément et l'élément lui-même, ça ne peut donc pas fonctionner.

    Et, comme dit précédemment, remove n'est pas approprié pour cela.
    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
     
    >>> l = [1, 4, 8, 5]
    >>> for e in enumerate(l):
    ...     print(e)
    ...     print(e[1][0])
    ... 
    (0, 1)
    Traceback (most recent call last):
      File "<stdin>", line 3, in <module>
    TypeError: 'int' object is not subscriptable
    >>> l.remove[1]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: 'builtin_function_or_method' object is not subscriptable
    >>> l.remove(1)
    >>> l
    [4, 8, 5]
    Troisième chose, il ne faut jamais modifier un itérable pendant son itération. Jamais.

    La solution est donc de créer une nouvelle liste avec les bons éléments.

  9. #9
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour,

    Merci a tous,

    J'ai fais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        print(gens)
        gens2=[]
        for e in enumerate(gens):
            if e[1][0] != 1:
                gens2.append(e[1])
        print(gens2)
    Ce qui renvoi :
    [[1, '01', 'dfsdfd', 'fsdf', '', 'Non'], [1, '01', 'encore 1', 'fghfg', '', 'Non'], [3, '03', 'fgdfgf', 'df', '', 'Non'], [2, '02', 'le 2', '222', '', 'Non'], [1, '01', 'sdfds', 'sd', '', 'Non']]
    [[3, '03', 'fgdfgf', 'df', '', 'Non'], [2, '02', 'le 2', '222', '', 'Non']]


    c'est donc OK
    Une dernière question : enumerate renvoi toujours un tuple ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Cette réponse est facilement accessible dans la documentation python :
    https://docs.python.org/3/library/fu...html#enumerate

  11. #11
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    En effet, merci

  12. #12
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Citation Envoyé par Ragus1970 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        print(gens)
        gens2=[]
        for e in enumerate(gens):
            if e[1][0] != 1:
                gens2.append(e[1])
        print(gens2)
    C'est impossible, e[1][0] doit lever une erreur !

    Edit: Au temps pour moi, tu as du texte dans tes listes, mais de toutes manières ce n'est pas correct par rapport à ce que tu veux faire.

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 795
    Par défaut
    Citation Envoyé par VinsS Voir le message
    C'est impossible, e[1][0] doit lever une erreur !

    Edit: Au temps pour moi, tu as du texte dans tes listes, mais de toutes manières ce n'est pas correct par rapport à ce que tu veux faire.

    As tu vu qu'il utilise enumerate ?
    e est donc un tuple index, élément donc e[1] correspond à l’élément (qui est une liste dans l'exemple) et e[1][0] est le premier élément de celle ci

  14. #14
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour,

    Ca fonctionne bien chez moi, par contre comment je fais pour remettre le tout dans gens, j'ai essayé
    gens=[]
    gens = gens2

    mais ça veut pas !

  15. #15
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Vous n'avez pas besoin d'enumerate, et regarder comme le code a beaucoup plus de sens sans ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    gens=[[1, '01', 'dfsdfd', 'fsdf', '', 'Non'], 
          [1, '01', 'encore 1', 'fghfg', '', 'Non'], 
          [3, '03', 'fgdfgf', 'df', '', 'Non'], 
          [2, '02', 'le 2', '222', '', 'Non'], 
          [1, '01', 'sdfds', 'sd', '', 'Non']]
    print(gens)
    gens2=[]
    for gen in gens:
        if gen[0] != 1:
            gens2.append(gen)
    print(gens2)
    gens=gens2  ### Attention, si vous touchez après à gens2, gens sera modifié !
    print(gens)
    et gens=gens2 fonctionne ...

  16. #16
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Août 2017
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Août 2017
    Messages : 141
    Par défaut
    Bonjour lg_r3,

    En effet, c'est plus simple, plus propre et plus lisible.

    Merci

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

Discussions similaires

  1. [AC-2003] Suppression dans liste modifiable intersection ligne/colonne
    Par JPaul94300 dans le forum IHM
    Réponses: 1
    Dernier message: 16/06/2009, 17h02
  2. [MySQL] Requete suppression et liste déroulante
    Par nasbe dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 09/06/2008, 14h52
  3. Suppression ligne List-Box par clavier
    Par mxh77 dans le forum 4D
    Réponses: 0
    Dernier message: 29/04/2008, 16h44
  4. [JaVaScRiPt]Suppression valeur liste déourante
    Par zybay dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 09/05/2007, 11h24
  5. Pb ajouter/suppression élément liste
    Par jerome38000 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 05/09/2005, 15h54

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