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 :

append list via une comprehensive list


Sujet :

Python

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 16
    Points
    16
    Par défaut append list via une comprehensive list
    Bonjour,

    encore une petite question de base sur python
    J'aimerai ajouter des éléments à une liste. Pour cela j'ai écris ma boucle en compréhensive list:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    vtx = [liste de vecteurs]
    Pointlist=[]
    Pointlist.append([v for v in vtx if v not in Pointlist]) # Ajoute seulement si v n'y est pas déjà
    Ça fonctionne bien mais ça me sort une liste de liste en fait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [[Vector3(55,181,0), Vector3(55,181,10000), Vector3(55,181,0)]]
    Comment faire en sorte que chaque élément soit au niveau 1 de ma liste ?

    Si je remplace les crochets par des parenthèses dans ma boucle, ça crée un generator...que je ne sais pas utiliser :s

    Merci à vous

    ps: Je sais qu'il y aurait une façon plus joli de faire le test que je viens d'écrire mais j'ai simplifié mon code pour expliquer mon problème. En tous cas, c'est sous cette forme que je voudrais réaliser la boucle dans mon programme

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 43
    Points : 67
    Points
    67
    Par défaut
    La méthode append() ajoute l'élément qu'on lui donne en paramètre. En l’occurrence, ici, cet élément est une liste.

    Pour concaténer des listes voici la meilleur des solutions :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = liste1 + liste2 + ...

    soit, dans ton exemple :
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    liste1 += [ val for val in liste2  if val not in liste1 ]

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 059
    Points : 1 396
    Points
    1 396
    Par défaut
    y a une méthode pour ça ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pointlist.extend([v for v in vtx if v not in Pointlist])

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    ahhh c'est super malin ça !

    Encore 1 dernier truc: le test "val not in list1" ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    list1=[1]
    >>> 1 in list1
    True
    >>> 1 in list1 == True
    False
    C'est pas comme ça que l'on fait ?

  5. #5
    Expert éminent

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 302
    Points : 6 782
    Points
    6 782
    Par défaut
    Salut,

    Ce sera toujours False de cette manière.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> l = [1]
    >>> 1 in l
    True
    >>> 1 in l == True
    False
    >>> 1 in l == False
    False
    Mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> (1 in l) == True
    True

  6. #6
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    ah oui ok je vois pourquoi

    mais je n'arrive pas à obtenir ce que je veux dans la boucle
    j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list2+=[val for val in list1 if (val not in list2)]
    mais ca ne fonctionne pas.
    Même chose quand je test si ça renvoie True ou False, soit ça met toutes les valeurs soit aucune ...

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 912
    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 : 3 912
    Points : 7 295
    Points
    7 295
    Par défaut
    J'ai du mal à capter la difficulté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> liste = [12, 5, 6, 14, 2, -1, 0, 9]
    >>> liste2 = []
    >>> liste2 = [x for x in liste if x not in liste2]
    >>> liste2
    [12, 5, 6, 14, 2, -1, 0, 9]

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    J'ai du mal à capter la difficulté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> liste = [12, 5, 6, 14, 2, -1, 0, 9]
    >>> liste2 = []
    >>> liste2 = [x for x in liste if x not in liste2]
    >>> liste2
    [12, 5, 6, 14, 2, -1, 0, 9]
    Salut Fred1599,
    Dans ton exemple il n'y a pas de valeur redondante dans ta liste.
    Voici ma difficulté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> l1=['r','t','r']
    >>> l2=[]
    >>> l2+=[val for val in l1 if (val not in l2)]
    >>> l2
    ['r', 't', 'r']
    Je retrouve deux fois 'r'

    Edit : on dirait que la liste n'est pas réévaluée pour cahque val sous cette forme. Car si je décompose en plusieurs lignes 'for' et 'if', je ne retrouve qu'une seule fois la même valeur dans liste2

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 912
    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 : 3 912
    Points : 7 295
    Points
    7 295
    Par défaut
    Il fallait le dire que c'était pour éliminer les doublons


  10. #10
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    et beh en fait c'est un peu plus compliqué que ça
    car ce test est fait à l'intérieur d'une autre boucle. A chaque passage de la boucle liste1 est modifiée et je ne voudrais ajouter les valeurs de liste1 seulement si elles n'ont pas déjà été ajoutées auparavant.
    Avec le set(), ça ajoute toutes les valeurs uniques de liste1 mais sans tester si elles sont déjà dans liste2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> l1=['r','t','r']
    >>> l2=[]
    >>> l2+=set(l1)
    >>> l2
    ['r', 't']
    >>> l2+=set(l1)
    >>> l2
    ['r', 't', 'r', 't']
    C'est pour ça que je voulais utiliser le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l2+=[val for val in l1 if val not in l2]

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 912
    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 : 3 912
    Points : 7 295
    Points
    7 295
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    l = lambda l1, l2: [l2.append(x) for x in l1 if x not in l2]
    l1 = ['r','t','r']
    l2 = []
    l(l1, l2)
    print(l2)

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2010
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 27
    Points : 16
    Points
    16
    Par défaut
    whoo, c'est super ça !

    Merci beaucoup fred1599 !!!

    bonne journée

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

Discussions similaires

  1. Associer deux liste via une troisième
    Par Badaboum33 dans le forum Excel
    Réponses: 3
    Dernier message: 31/05/2011, 15h18
  2. Réponses: 1
    Dernier message: 22/12/2009, 20h05
  3. Passer d'une int list a une string list
    Par slayer___ dans le forum Caml
    Réponses: 1
    Dernier message: 08/05/2008, 16h46
  4. [GTK+] Modifier une liste via une fonction callback
    Par odsen.s dans le forum GTK+ avec C & C++
    Réponses: 12
    Dernier message: 03/05/2007, 17h33
  5. [Conception] Création d'un Mailing List via une BDD
    Par Matmax dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 12/04/2006, 14h23

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