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 :

Gerer deux listes différentes Python 3.3


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    cuisinier
    Inscrit en
    Janvier 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : cuisinier
    Secteur : Alimentation

    Informations forums :
    Inscription : Janvier 2013
    Messages : 15
    Par défaut Gerer deux listes différentes Python 3.3
    Bonjour ,voici mon code et mon problème :

    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
     
    import csv
     
    #Chemin vers le fichier csv
    fname = "C:/Users/Programmateur/Documents/positions.csv"
     
     
    #Ouvrir le fichier csv en lecture et le charger dans une liste
    r_file = open(fname, "r")
    file = csv.reader(r_file,lineterminator='\n')
     
    lst = []
    for ligne in file:
        lst.append(ligne);
     
    #Copier le contenu de lst dans lstB    
    lstB = lst[:]   
     
    #Modifier le contenu de lst
    lst[0][0] = "9";
     
    #Vérifier que les deux listes sont bien différentes
    print("Liste    : ",lst)
    print("ListeBis : ",lstB)
     
    r_file.close()
    Mon problème, c'est que ma liste numéro 2 "lstB" se trouve modifiée en même temps que "lst"

    Or si je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #Modifier le contenu de lst
    lst[0] = "9";
    Là tout va bien, seule "lst" est modifié. Sauf que mes listes étant des listes de listes ( tableaux je crois ) j'ai besoin de mettre les deux indices pour accéder et modifier un sel élément et pas ma ligne entière.

    Merci pour votre aide

  2. #2
    Expert confirmé

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Tu peux soit créer la deuxième liste en même temps que la première,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    lst = []
    lstb = []
    for ligne in file:
        lst.append(ligne)
        lstb.append(ligne)
    soit la créer par list comprehension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    >>> a = [[1, 2, 5], [4, 6, 8], [4, 7, 1]]
    >>> b = [l[:] for l in a]
    >>> b
    [[1, 2, 5], [4, 6, 8], [4, 7, 1]]
    >>> a[0][1] = "z"
    >>> a
    [[1, 'z', 5], [4, 6, 8], [4, 7, 1]]
    >>> b
    [[1, 2, 5], [4, 6, 8], [4, 7, 1]]

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur en formation
    Inscrit en
    Juillet 2013
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en formation
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 300
    Par défaut
    C'est une question de portée des variables. Si tu fais :
    b va pointer sur a, c'est à dire que les 2 variables pointent sur le même objet. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    b.append('ajout')
    print(a)
    [1,45,'test','ajout']
    print(b)
    [1,45,'test','ajout']
    Si l'on modifie l'un, l'autre est également modifié, la solution est de copier le contenu de la première dans la seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a=[1,45,"test"]
    b=list(a) #on appelle alors le constructeur de la classe
    Ainsi, a et b sont 2 objets indépendants.

  4. #4
    Membre averti
    Homme Profil pro
    cuisinier
    Inscrit en
    Janvier 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : cuisinier
    Secteur : Alimentation

    Informations forums :
    Inscription : Janvier 2013
    Messages : 15
    Par défaut
    Voici le code complet modifié en fonction de vos conseil :
    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
    import csv
     
    #Chemin vers le fichier csv
    fname = "C:/Users/Programmateur/Documents/positions.csv"
     
    #Ouvrir le fichier csv en lecture et le charger dans une liste
    r_file = open(fname, "r")
    file = csv.reader(r_file,lineterminator='\n')
     
    lst = []
     
    for ligne in file:
        lst.append(ligne);
     
    lstB = list(lst)  
     
    print("Liste    : ",lst);
    print("ListeBis : ",lstB);
     
    lst[0][0] = "9";
     
    #Verifier si les deux listes ne sont pas identiques
    if  lstB != lst:
     
        #Ouvrir le fichier csv en ecriture et enregistre la liste
        #si différente de la liste de référence
        w_file = open(fname, "w")
        file = csv.writer(w_file,lineterminator='\n')
        file.writerows(lst)
        w_file.close()
        print("Il y a eu un changement")
    else:
        r_file.close()
        print("Il n'y a pas eu de changement")
     
    print("Liste    : ",lst)
    print("ListeBis : ",lstB)
     
    del lst
    del lstB
    Mais mon problème reste le même, "lstB" se trouve encore modifié

    edit: Autant pour moi, apparemment, en créant ma liste par compréhension, j'ai plus de problème, mais j'arrive pas encore a comprendre pourquoi ... En tout cas merci pour votre aide et vos réponse

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Par défaut
    Citation Envoyé par narcibrook Voir le message
    edit: Autant pour moi, apparemment, en créant ma liste par compréhension, j'ai plus de problème, mais j'arrive pas encore a comprendre pourquoi
    En simplifiant les choses, quand tu fais "lst=lst2", tu lui dis que les 2 listes sont les même donc quand tu en modifies 1 ça modifie l'autre
    Et quand tu utilises "lst=list(lst2)", il l’interprète comme créer une autre liste indépendante de la première mais avec les même éléments au moment de la création (ensuite, chacune fait sa propre vie )

    Edit: oups j'avais pas vu la réponse @Stalacta qui te donnais l'explication

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Bonjour, les explications données jusqu'ici manquent peut-être un peu de détails pour décrire ce qui se passe.
    Je prendrais comme exemple la liste suivante:
    lst = [[1,2],[3,4]] est une liste de longueur 2, dont chaque élément est une liste de longueur 2 (contenant un nombre entier). On peut la représenter graphiquement (première image jointe).
    lst2 = lst crée une référence à la liste existante (seconde image jointe)

    Pour faire une copie, les 4 méthodes suivantes sont équivalentes (3ème image jointe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lst2 = lst[:]
    lst2 = list(lst)
    lst2 = [l for l in lst]
    lst2 = copy.copy(lst) (en important le module copy)
    On peut encore en trouver d'autres. Comme on le voit sur le graphique, cela ne copie que le premier niveau de la liste, les sous-listes restent identiques.

    Maintenant en écrivant lst2 = [l[:] for l in lst], cela combine deux des techniques précédentes pour faire une copie sur deux niveaux (4ème image jointe). On pourrait aussi bien écrire lst2 = [list(l) for l in lst] ou encore lst2 = [[e for e in l] for l in lst], le résultat serait le même.

    Cela peut se généraliser à plus de deux niveaux.

    Si on veut être certain de faire une copie complète, quel que soit le niveau de profondeur de la structure (cela ne se limite pas aux listes, le même raisonnement est valable pour n'importe quelle structure d'objets mutables), on peut utiliser la méthode deepcopy du module copy:
    lst2 = copy.deepcopy(lst)
    Dans le cas présent, cela donnera le même résultat que précédemment (dernier graphique).
    Images attachées Images attachées     

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

Discussions similaires

  1. [JAXB] Marshal un objet apparetenant à deux listes différentes
    Par spimelabs dans le forum Format d'échange (XML, JSON...)
    Réponses: 0
    Dernier message: 15/07/2013, 06h06
  2. Actualiser deux listes différentes + Bouton d'édition
    Par Gannox dans le forum VBA Access
    Réponses: 3
    Dernier message: 03/01/2012, 15h37
  3. [AC-2002] attribuer deux requêtes différentes à une liste
    Par Jean-Luc80 dans le forum VBA Access
    Réponses: 2
    Dernier message: 26/09/2010, 12h36
  4. Eléments différents de deux listes
    Par circe dans le forum R
    Réponses: 1
    Dernier message: 28/07/2009, 22h36
  5. deux listes li différentes
    Par JBLCN dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 16/07/2007, 03h10

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