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 une matrice à partir d'une liste de listes


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Créer une matrice à partir d'une liste de listes
    Bonjour à tous,

    Je bloque sur ce sujet depuis un moment, et malgré les divers tutoriels sur les listes que j'ai parcouru, je suis toujours un peu perdu...

    Ce que je souhaiterais faire serait de:
    - Créer une liste en ajoutant un à un ses éléments (au travers d'une boucle for)
    - Créer une liste de listes en ajoutant les liste crées unes à unes (grâce à une boucle for également)
    - Et enfin, créer une matrice à partir de cette liste de listes (une colonne représentant une liste)

    Pour rentrer un peu plus dans le code, cela ressemblerait à ceci: (désolé d'avance pour la syntaxe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import pandas as pd
     
    for j in range (0,3):
        for i in range(0,4):
            list_1.append(i)
        list_2.append(list_1)
    matrice=pd.DataFrame(list_2)
    matrice_t=df_matrice.transpose()
     
    print(matrice_t)
    Dans l'idée j'aimerais donc obtenir ceci:

    0 0 0
    1 1 1
    2 2 2
    3 3 3

    Là où je m'y prends mal c'est que ce code crée une list_2 qui au lieu de mettre à la suite les listes, met à la suite les valeurs de ces listes. Donc list_2, au lieu d'être une liste de listes est en fait une seule liste. Il doit falloir utiliser quelque chose d'autre que .append, mais je n'ai pas trouvé...

    Ou alors peut être (certainement en fait) que je me complique la vie pour rien, à la base je voulais créer une dataframe par ajout de colonnes dans une boucle for... Mais n'ayant pas trouvé comment faire je me suis rabattu vers la technique plus haut.

    Merci pour votre aide,

    Hozem

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    788
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 788
    Points : 446
    Points
    446
    Par défaut
    Bonjour,


    Citation Envoyé par Hozem Voir le message
    Bonjour à tous,

    for j in range (0,3):
    for i in range(0,4):
    list_1.append(i)
    list_2.append(list_1)
    matrice=pd.DataFrame(list_2)
    matrice_t=df_matrice.transpose()

    print(matrice_t)[/CODE]

    Dans l'idée j'aimerais donc obtenir ceci:

    0 0 0
    1 1 1
    2 2 2
    3 3 3
    L'algo de ton code ne correspond pas au résultat que tu souhaite avoir

    Citation Envoyé par Hozem Voir le message
    Là où je m'y prends mal c'est que ce code crée une list_2 qui au lieu de mettre à la suite les listes, met à la suite les valeurs de ces listes. Donc list_2, au lieu d'être une liste de listes est en fait une seule liste. Il doit falloir utiliser quelque chose d'autre que .append, mais je n'ai pas trouvé...
    Pour moi, list_2 est bien une liste de liste ... j'ai vérifié pour être sur
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    list_2  = []
    list_1 = []
     
    for j in range (0,3):
        for i in range(0,4):
            list_1.append(i)
        list_2.append(list_1)
    print(list_2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [[0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3]]
    Le savoir est une arme alors soyons armés

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hozem Voir le message
    Dans l'idée j'aimerais donc obtenir ceci:

    0 0 0
    1 1 1
    2 2 2
    3 3 3
    Bonjour

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    res=[]
     
    for i in range(4):
    	res.append([i,] * 3)
    print(res)

    Et si tu veux te familiariser avec les listes en intention...
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    res=[[i,] * 3 for i in range(4)]
    print(res)
    (grosso-modo on remplace res.append(truc) par res=[truc .........] puis on place le for à la place des points de suspension)

    Citation Envoyé par DonKnacki Voir le message
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    list_2  = []
    list_1 = []
     
    for j in range (0,3):
        for i in range(0,4):
            list_1.append(i)
        list_2.append(list_1)
    print(list_2)
    T'as oublié de réinitialiser list_1 au début de son remplissage itératif. Et comme tu ne copies que son "adresse" dans list_2 tu te retrouves au final avec 3 instance de la même liste. Rajoute list_2[0][0]=123 et tu verras "123" s'afficher partout où il y avait "0"...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci à vous pour votre aide.
    J'ai réussi avec ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    list_2  = []
    list_1 = []
     
    for j in range (0,3):
        list_1=[]
        for i in range(0,4):
            list_1.append(i)
        list_2.append(list_1)
    matrice=pd.DataFrame(list_2)
    matrice=matrice.transpose()
    print(matrice)
    Mais en effet c'est beaucoup plus élégant avec les listes en intention

    Merci, résolu.

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Hozem Voir le message
    J'ai réussi avec ce code ...list_2.append(list_1).
    Je suis dubitatif à propos de ton code. Tu crées la matrice dans le mauvais sens puis tu la fais pivoter (alors que tu aurais pu la créer de suite dans le bon sens !!!) c'est un peu bizarre non ?
    Mais bon, c'est pas important. Le vrai problème de ton code c'est qu'il faut faire extrèmement attention quand on écrit un truc de ce style var=liste_existante (et tout ce qui ressemble de près ou de loin à une affectation comme append()) parce qu'une liste étant un élément assez "complexe", Python se contente de ne copier que son adresse (et non son contenu).
    Il en résulte que toute modification ultérieure de la liste se répercute aux endroits où elle a été copiée ce qui n'est pas forcément ce que l'on aurait voulu.
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    orig=[1, 2, 3, 4]
    var=[]
    for i in range(3): var.append(orig)
    print var      # Ici tout va bien
    orig[0]="toto"
    print var      # Ici ça ne va plus !!!

    Il se trouve que pour toi, par un heureux hasard, cela se passe (presque) bien. Mais cet heureux hasard est uniquement dû à cette simple ligne: list_1=[] dans ta boucle. Cette ligne a pour effet d'effacer tout ce qui a trait à "list_1" puis de recréer une nouvelle variable "list_1" entièrement neuve. Ainsi, chaque append() récupère des instances différentes. Toutefois cela se passe bien seulement dans le fait que si on modifie un élément de list_2 cela ne se répercute pas dans ses autres ; pas dans le fait que si on modifie list_1 on voit cette modif se répercuter dans list_2.

    Ensuite, si tu remplaces ton code par celui-ci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    list_2  = []
    list_1 = []
     
    for j in range (0,3):
        del list_1[:]    
        for i in range(0,4):
            list_1.append((i)
        list_2.append(list_1)
    print list_2
    list_2[0][0]="toto"
    print list_2
    Et là tout va mal. Pourtant tu n'as rien fait d'autre que remplacer une instruction ayant pour but originel de nettoyer list_1 par une autre différente (qui a bien entendu le même but). Mais cette petite modif a un effet de bord indésirable...

    Voici la bonne façon de rajouter ta list_1 dans list_2: list_2.append(list_1[:]). Le slice ([:])a pour effet de récupérer une copie du contenu de la liste et non une copie de sa référence...

    Citation Envoyé par Hozem Voir le message
    Mais en effet c'est beaucoup plus élégant avec les listes en intention
    C'est une écriture conçue pour ressembler aux expressions mathématiques décrivant des ensembles.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Novembre 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Novembre 2017
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Ah oui d'accord, je n'étais pas au courant de cette subtilité. Merci.

    Comme ceci du coup ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    list_2  = []
    list_1 = []
     
    for i in range (0,4):
        list_1=[]
        for j in range(0,3):
            list_1.append(i)
        list_2.append(list_1[:])
    matrice=pd.DataFrame(list_2)
    print(matrice)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/08/2014, 22h05
  2. Réponses: 5
    Dernier message: 21/05/2014, 14h09
  3. Créer un cube à partir d'une matrice
    Par piflechien73 dans le forum VBA Access
    Réponses: 3
    Dernier message: 16/10/2010, 13h45
  4. Réponses: 28
    Dernier message: 05/03/2009, 12h55

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