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 :

Encore des soucis avec les listes. [Python 3.X]


Sujet :

Python

  1. #1
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut Encore des soucis avec les listes.
    Désolé de vous ennuyer pour un problème assez basique également.
    Je pensais être au point sur les listes, mais ce n'est vraiment pas le cas.

    J'ai deux listes (de chacune 121 listes contenant elles-mêmes une trentaine de chaînes) issues de fichiers .csv.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    l1 = [['toto,12,25'],['tata,26,48'],['titi,14,89'],['tutu,28.2,47']]
    l2 = [['tutu,28.2,47,1'],['tata,26,48,2'],['titi,14,89,3'],['toto,12,25,4']]
     
    for i in range(len(l1)):
        el1 = l1[i][0].split(',')
        el2 = l2[i][0].split(',')
     
        nom=[]
        for j in range(3):
            nom.append(el1[j])
     
        print(nom)
    Je souhaiterais réécrire une liste (en fait un fichier csv au final) contenant les éléments de la liste l1 auxquels sont ajoutés en fin le dernier terme de la deuxième liste de façon à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l1 = [['toto,12,25,4'],['tata,26,48,2'],['titi,14,89,3'],['tutu,28.2,47,1']]
    (en réalité, dans mes fichiers, je peux avoir 2 "toto" et il faudra que j'aille voir le deuxième élément.

    Si quelqu'un peut m'aider car je tourne en rond.
    Pas d'aide par mp.

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par marco056 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l2 = [['tutu,28.2,47,1'],['tata,26,48,2'],['titi,14,89,3'],['toto,12,25,4']]
    (...) de façon à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    l1 = [['toto,12,25,4'],['tata,26,48,2'],['titi,14,89,3'],['tutu,28.2,47,1']]
    c'est une impression ou ta nouvelle liste l1 correspond simplement à l2 ?

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Oui, c'est vrai, sauf que je veux conserver l'ordre de la première liste dans mon fichier csv, donc dans l1.
    Pas d'aide par mp.

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    la méthode la plus "simple" c'est quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> [s2 for s1 in l1 for s2 in l2 if s1[0] in s2[0]]
    [['toto,12,25,4'], ['tata,26,48,2'], ['titi,14,89,3'], ['tutu,28.2,47,1']]
    je reviens pas sur les list comprehensions, dans le principe pour chaque valeur de l1 on va parcourir toutes les valeurs de l2 et si y'en a une "qui y ressemble" (if s1[0] in s2[0]) alors on la comptabilise dans notre liste de sortie, ça marche, et c'est assez facile à pondre finalement, suffit d'être un peu souple si j'ose dire, en revanche ça n'est pas optimal et si on a beaucoup d'items dans nos listes ça peut potentiellement poser un problème de perfs

    à vérifier, mais il me semble que cette version-ci fait le job en s'arrêtant dès qu'on a trouve la première occurrence grâce au next(), le résultat est identique sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> map(lambda s1:next(s2 for s2 in l2 if s1[0] in s2[0]), l1)
    [['toto,12,25,4'], ['tata,26,48,2'], ['titi,14,89,3'], ['tutu,28.2,47,1']]
    edit: pour le principe je mets également la version "dépliée" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    l3 = []
    for s1 in l1:
      for s2 in l2:
        if s1[0] in s2[0]:
          l3.append(s1)
          break  # toute la difference entre les deux solutions précédentes

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Merci beaucoup !
    Je regarde cela ce we.
    Pas d'aide par mp.

  6. #6
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    La première solution marche parfaitement.
    J'avoue que la fonction "map" me laisse perplexe car maple réagit différemment.
    Pour ce qui est de la dernière solution, elle m'intéresse fortement et je vais m'y pencher.
    Je passe le sujet en résolu, merci encore BufferBob !
    Pas d'aide par mp.

  7. #7
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par marco056 Voir le message
    J'avoue que la fonction "map" me laisse perplexe
    en fait on peut faire sans map() ça revient à la même chose que [next(s2 for s2 in l2 if s1[0] in s2[0]) for s1 in l1]

    Pour ce qui est de la dernière solution, elle m'intéresse fortement et je vais m'y pencher.
    avec le mot-clé break c'est l'équivalent de la 2e solution (ou de celle que je viens de donner juste avant), si on l'enlève c'est l'équivalent de la 1ere solution, d'un point de vue performance et "propreté" il vaut mieux la 2e solution quand même

    Je passe le sujet en résolu, merci encore BufferBob !
    no problem

  8. #8
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    La dernière option perturbe la suite, comme si le fichier csv créé ne possédait plus le même séparateur.
    Pas grave puisque les deux premières méthodes fonctionnent à merveille.
    En fait, cela me permet de voir que je ne suis pas au point sur les itérateurs : à creuser dès que j'aurai un peu plus de temps...
    Pas d'aide par mp.

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

Discussions similaires

  1. Des soucis avec les 4 PHASES en up
    Par happyboon dans le forum xUP
    Réponses: 0
    Dernier message: 09/08/2012, 12h30
  2. encore des soucis avec DFDSS
    Par syrius1509 dans le forum z/OS
    Réponses: 2
    Dernier message: 26/08/2011, 20h45
  3. [CognosScript] Encore des soucis avec une connexion ODBC
    Par ben_harper dans le forum Cognos
    Réponses: 1
    Dernier message: 23/06/2009, 19h08
  4. Un souci avec les listes déroulantes dynamiques
    Par namstou3 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 04/02/2008, 17h08
  5. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08

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