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 :

Créer n listes (où n est variable et dépend des valeurs d'une autre liste) [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Par défaut Créer n listes (où n est variable et dépend des valeurs d'une autre liste)
    Bonjour à tous,

    J'aimerais pouvoir créer et remplir des listes, en fonction des valeurs d'une colonne spécifique d'une liste initiale.
    A titre d'exemple, la liste pourrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list = [['Ingénieur','Pierre',30],['Chercheur','Etienne',40],['Chercheur','Sophie',25],['Ingénieur','Marie',54]]
    Et je voudrais obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list1 = [['Ingénieur','Pierre',30],['Ingénieur','Marie',54]]
    list2 = [['Chercheur','Etienne',40],['Chercheur','Sophie',25]]
    Ma problématique est que je ne connais pas le contenu de la liste (contrairement à ce que je présente ici. Et elle peut très bien contenir également une ligne ['Technicien','Jean',42] ou tout autre élément.
    Je connais seulement le nombre de colonnes de mon tableau.

    J'aimerais donc pouvoir créer une nouvelle liste pour chaque élément différent de ma colonne 1, sans en savoir le nombre au départ.
    Mais je ne sais pas s'il est possible (et comment) de créer ces listes "conditionnées".

    Je précise que j'aimerais déjà essayer de faire cela sans numpy, si c'est jouable ;-)

    Quelqu'un a t'il une idée pour moi ?

    Merci d'avance !

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par jahawai Voir le message
    J'aimerais donc pouvoir créer une nouvelle liste pour chaque élément différent de ma colonne 1, sans en savoir le nombre au départ.
    Mais je ne sais pas s'il est possible (et comment) de créer ces listes "conditionnées".
    Avec un dictionnaire dont la clef serait la première colonne et la valeur associée la liste des éléments qui commencent avec cette chaine de caractères.

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

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    les listes en intension (list comprehensions) permettent de facilement générer tes deux listes avec leurs discriminants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> liste = [['Ingénieur','Pierre',30],['Chercheur','Etienne',40],['Chercheur','Sophie',25],['Ingénieur','Marie',54]]
    >>> list1 = [i for i in liste if i[0] == 'Chercheur']
    >>> list2 = [i for i in liste if i[0] == 'Ingénieur']
    on peut aussi faire tout en une passe en s'appuyant sur itertools.groupby() et obtenir le dictionnaire qu'évoque wiztricks :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> from itertools import groupby
    >>> liste = [['Ingénieur','Pierre',30],['Chercheur','Etienne',40],['Chercheur','Sophie',25],['Ingénieur','Marie',54]]
    >>> dico = dict((i,list(j)) for i,j in  groupby(sorted(liste), key=lambda i:i[0]))
    >>> dico['Ingénieur']
    [['Ingénieur', 'Marie', 54], ['Ingénieur', 'Pierre', 30]]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Par défaut
    Bonjour à tous les deux,

    Merci pour vos réponses, je vais regarder du côté des dictionnaires !

    Ton premier exemple ne me convient pas BufferBob, car il requiert de connaître ce qu'il y a dans les listes (c'est comme ça que je faisais jusqu'à présent, mais maintenant, je veux également que le code soit capable de générer lui-même une nouvelle liste si un utilisateur lambda vient ajouter des nouvelles entrée).
    Dans le 2ème exemple BufferBob, j'ai quand même l'impression qu'il faut connaître également la première colonne (au moins pour l'appeler derrière) mais je vais creuser ça.

    En tous cas merci et je reviens vers vous éventuellement !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 15
    Par défaut
    Rebonjour,

    Bon du coup, voilà le code qui me permet de faire ce que je voulais, en utilisant les dictionnaires et sans savoir, d'emblée, combien de valeurs différentes on aura dans la catégorie (ici "métier").
    C'est probablement assez moche, je m'excuse d'avance pour vos yeux d'experts. Mais ça fonctionne...

    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
    from itertools import groupby
     
    liste = [['Ingénieur','Pierre',30],['Chercheur','Etienne',40],['Chercheur','Sophie',25],['Ingénieur','Marie',54],['Chercheur','Sophie',24],['Technicien','Raymond',21]]
     
    # On construit un dictionnaire qui prend pour clé la première valeur de chaque liste
    dico = dict((i,list(j)) for i,j in  groupby(sorted(liste), key=lambda i:i[0]))
     
    # On construit la liste des métiers 
    liste_metiers = []
    for i in range(0,len(liste)):
        liste_metiers.append(liste[i][0])
     
    # A laquelle on enlève les doublons
    liste_sans_doublons = list(set(liste_metiers))
     
    # On renvoie une liste pour chaque métier
    for i in range(0,len(liste_sans_doublons)):
        print(dico[liste_sans_doublons[i]])
    Merci pour votre aide !

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    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 062
    Par défaut
    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
    job_list = [['Ingénieur','Pierre',30],
                ['Chercheur','Etienne',40],
                ['Chercheur','Sophie',25],
                ['Ingénieur','Marie',54],
                ['Chercheur','Sophie',24],
                ['Technicien','Raymond',21]]
     
     
     
    job_dict = {}
    for job in job_list:
        key, firstname, age = job
        values = (firstname, age)
        if key not in job_dict:
            job_dict[key] = [values,]
        else:
            job_dict[key].append(values)
     
     
    print(job_dict) # {'Technicien': [('Raymond', 21)], 'Ingénieur': [('Pierre', 30), ('Marie', 54)], 'Chercheur': [('Etienne', 40), ('Sophie', 25), ('Sophie', 24)]}

    Mais job_list peut être évité et on pourrait créer directement job_dict à la volée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/09/2014, 15h57
  2. Réponses: 2
    Dernier message: 22/01/2013, 18h31
  3. Réponses: 1
    Dernier message: 23/11/2012, 15h22
  4. Réponses: 8
    Dernier message: 21/03/2011, 11h38
  5. Réponses: 6
    Dernier message: 29/11/2007, 16h15

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