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 :

Gérer une liste de listes


Sujet :

Python

Vue hybride

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

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut Gérer une liste de listes
    Bonjour,

    Je suis face à un problème que je croyais simple mais que je n'arrive malheureusement pas à résoudre

    Voilà, j'ai une liste de listes de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste = [['nom1','classe1'],['nom2','classe2'],['nom3','classe3'],.....]
    Tous les 'nom' en position [i][0] sont différents, par contre il n'y a que 11 'classe' différentes.

    Ce que je dois faire, c'est répertorier dans une nouvelle liste tous les 'nom' pour chaque 'classe'.

    C'est-à-dire, par exemple, j'appelle ma nouvelle liste classe1, et dans classe1, je veux: ['nom1', 'nom12', 'nom15', 'nom45',.....] car en [i][1] dans liste, ils ont 'classe1'.


    J'ai procédé ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    classe1 =classe2 = classe3 = .... = []
    for i in liste:
    	if i[1] == 'classe1':
    	        classe1.append(i[0])
    	if i[1] == 'classe2':
    		classe2.append(i[0])
    	if i[1] == 'classe3':
    		classe3.append(i[0])
    	....
    Mais ça ne fonctionne pas....
    Car si je fais , j'ai 561, alors que si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    len(classe1)+len(classe2)+len(classe3)+....
    , j'ai 2060

    Comment dois-je faire ??

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Je suis sûr qu'il y a mieux, mais ça marche:

    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
    21
    22
    23
    24
    25
    26
    27
     
    liste = [['nom1','classe1'],
             ['nom2','classe2'],
             ['nom3','classe3'],
             ['nom4','classe1'],
             ['nom5','classe3'],
             ['nom6','classe3'],
             ['nom7','classe3'],
             ['nom8','classe1'],
             ['nom9','classe2'],
             ['nom10','classe3'],
             ['nom11','classe1'],
             ['nom12','classe3'],
             ['nom13','classe2']
             ]
     
    for x in liste:
        x.reverse()
    liste.sort()
    R=[]
    for x in liste:
        if (R==[]) or (x[0]!=R[-1][0]):
            R.append(x)
        else:
            R[-1].append(x[1])
     
    print R
    Ce qui donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    [['classe1', 'nom1', 'nom11', 'nom4', 'nom8'], 
    ['classe2', 'nom13', 'nom2', 'nom9'], 
    ['classe3', 'nom10', 'nom12', 'nom3', 'nom5', 'nom6', 'nom7']]
    Tyrtamos

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut
    J'ai réécrit mon code en me basant sur le votre, ce qui me donne :

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    for i in liste:
        i.reverse()
     
    liste.sort()
    SmP = a = b = AB = ab = CC = D = _ = M = L = [] #ce sont les noms de mes 10 classes différentes
     
    for i in liste:
    	if (SmP==[]) or (i[0]!=SmP[-1][0]):
    		SmP.append(i)
    	else:
    		SmP[-1].append(i[1])
    	if (a==[]) or (i[0]!=a[-1][0]):
    		a.append(i)
    	else:
    		a[-1].append(i[1])
    	if (b==[]) or (i[0]!=b[-1][0]):
    		b.append(i)
    	else:
    		b[-1].append(i[1])
    	if (AB==[]) or (i[0]!=AB[-1][0]):
    		AB.append(i)
    	else:
    		AB[-1].append(i[1])
    	if (ab==[]) or (i[0]!=ab[-1][0]):
    		ab.append(i)
    	else:
    		ab[-1].append(i[1])
    	if (CC==[]) or (i[0]!=CC[-1][0]):
    		CC.append(i)
    	else:
    		CC[-1].append(i[1])
    	if (D==[]) or (i[0]!=D[-1][0]):
    		D.append(i)
    	else:
    		D[-1].append(i[1])
    	if (_==[]) or (i[0]!=_[-1][0]):
    		_.append(i)
    	else:
    		_[-1].append(i[1])
    	if (M==[]) or (i[0]!=M[-1][0]):
    		M.append(i)
    	else:
    		M[-1].append(i[1])
    	if (L==[]) or (i[0]!=L[-1][0]):
    		L.append(i)
    	else:
    		L[-1].append(i[1])
    Seulement, il me dit que toutes mes classes font la même taille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    len(SmP)=len(a)=len(b)=len(AB)=....=10



    De plus, je ne veux pas une liste de listes comme résultat, mais plutôt 10 listes différentes avec seulement les noms dedans.

  4. #4
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    En continuant mon code, si on ajoute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    for x in R:
        globals()[x[0]] = repr(x[1:])
    on a créé toutes les variables classe1, classe2, ... et on leur a affecté la liste qui les concerne. Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    print "classe1 =",classe1
    print "classe2 =",classe2
    print "classe3 =",classe3
     
    classe1 = ['nom1', 'nom11', 'nom4', 'nom8']
    classe2 = ['nom13', 'nom2', 'nom9']
    classe3 = ['nom10', 'nom12', 'nom3', 'nom5', 'nom6', 'nom7']
    Tyrtamos

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 69
    Par défaut
    tyrtamos --> j'ai rajouté la liste à mon code, en l'adaptant et ça ne marche pas...
    en+, je ne comprends absolument pas les résultats:

    j'obtiens:
    si je fais : len(SmP), il me renvoie 21, et m'affiche seulement un 'nom'
    si je fais: len(b), il me renvoie 10, et m'affiche une liste de 'nom' de la taille de ma liste initiale (561).



    Jiyuu --> je vais essayer de mettre ma liste en dico, et de voir si je m'en sors mieux. Sinon, j'accepte ton aide sans problème.
    EDIT : voici mon code pour transformer ma liste en un dictionnaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dico = {}
    for i in range(len(liste)):
               dico[liste[i][1]]=liste[i][0]
    La taille de mon dictionnaire fait bien 10, c'est-à-dire correspondant aux 10classes différentes.
    Cependant, il ne me marque comme values que la dernière protéine de la liste possédant cette classe

  6. #6
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    J'avoue que j'ai du mal à comprendre ton pb. J'en reste à ta première notation. Et comme ça:

    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
    21
    22
    23
    24
    25
     
    liste = [['nom1','classe1'], ['nom2','classe2'], ['nom3','classe3'],     
             ['nom4','classe1'], ['nom5','classe3'], ['nom6','classe3'],
             ['nom7','classe3'], ['nom8','classe1'], ['nom9','classe2'],
             ['nom10','classe3'], ['nom11','classe1'], ['nom12','classe3'],
             ['nom13','classe2']]
     
    classe1=[]
    for x in liste:
        if x[1]=='classe1':
            classe1.append(x[0])
     
    classe2=[]
    for x in liste:
        if x[1]=='classe2':
            classe2.append(x[0])
     
    classe3=[]
    for x in liste:
        if x[1]=='classe3':
            classe3.append(x[0])
     
    print classe1
    print classe2
    print classe3
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ['nom1', 'nom4', 'nom8', 'nom11']
    ['nom2', 'nom9', 'nom13']
    ['nom3', 'nom5', 'nom6', 'nom7', 'nom10', 'nom12']
    Tyrtamos

  7. #7
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Billets dans le blog
    15
    Par défaut
    Tu peux peut-être aussi travailler avec des dicos, où dans un premier temps les clé seront les noms et les valeurs les classes et où dans un deuxième temps et après un petit traitement tu inverses ceci.

    Tu peux aussi faire ça en utilisant le module shelve (merci à Tyrtamos qui me l'a fait découvrir).

    Je n'ai pas trop eu le temps de regarder pour le moment. J'essaye de voir ça dans la soirée si cela t'intéresse.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

Discussions similaires

  1. Comment gérer une liste sans doublons ?
    Par olibara dans le forum C#
    Réponses: 3
    Dernier message: 17/05/2008, 12h24
  2. Regrouper une liste en liste de listes
    Par West01 dans le forum Prolog
    Réponses: 12
    Dernier message: 14/03/2008, 14h07
  3. gérer une liste/sélectionner des lignes /cocher des checkbox
    Par lauben dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 13/09/2007, 09h41
  4. [VB.net] Comment gérer une liste de threads ?
    Par pdgnr dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/12/2006, 12h42
  5. Gérer une liste de diffusions
    Par oldos dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 07/06/2006, 16h51

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