Problème ajout d'un objet dans une liste Python

Résolu/Fermé
gdepotter Messages postés 5 Date d'inscription vendredi 21 décembre 2018 Statut Membre Dernière intervention 25 décembre 2018 - Modifié le 23 déc. 2018 à 21:28
gdepotter Messages postés 5 Date d'inscription vendredi 21 décembre 2018 Statut Membre Dernière intervention 25 décembre 2018 - 25 déc. 2018 à 20:52
Bonjour,

Je souhaite créer une liste qui reprendrait tous les films (repris d'un fichier CSV), sachant que chaque film est un objet Movie.
Mais, lorsque j'ajoute un objet à la liste, il ajoute bien cet objet mais il écrase aussi automatiquement tous les objets de la liste et les remplace par l'objet qu'on voulait ajouter.

Voilà la classe :

class Movie:



    # -------------------------------------------------------------------------

    movie_id: int

    movie_imdb: int

    name: str

    actors: List[Actor]

    summary: str

    category: List[str]



    # -------------------------------------------------------------------------

    def __init__(self, movie_id: int, name: str, category: []):

        self.movie_id = movie_id

        self.movie_imdb = 0

        self.name = name

        self.actors = []

        self.summary = ""

        self.category = category

    # -------------------------------------------------------------------------

    def imprimer(self):

        print(movie_id)

        print(name)

        print(category)


Code pour stocker les films dans la liste :
f = open ('test_movies.csv')
fichier_test = csv.reader(f)
category = []
tous_les_films = []#Liste qui contiendra l'ensemble des films provenant du fichier movies.csv
movieId = 0
for ligne in fichier_test:
    category.clear()
    movie_id = ligne[0]
    name = ligne[1]
    category_ligne = ligne[2]
    for mot in category_ligne.split("|"):
        category.append(mot)
    film = Movie(movie_id, name, category)
    tous_les_films.append(film) 
for i in tous_les_films:
    i.imprimer()
Output:
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']
5 Father of the Bride Part II (1995) ['Comedy']


Contenu fichier Csv:

1,Toy Story (1995),Adventure|Animation|Children|Comedy|Fantasy
2,Jumanji (1995),Adventure|Children|Fantasy
3,Grumpier Old Men (1995),Comedy|Romance
4,Waiting to Exhale (1995),Comedy|Drama|Romance
5,Father of the Bride Part II (1995),Comedy


Merci d'avance pour votre aide :)

3 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
21 déc. 2018 à 15:39
Bonjour,

Du python sans indentation, c'est absolument illisible.
Pourriez-vous utiliser la balise < code>, avec le langage idoine (bouton <> dans l'interface de saisie du message), qui permet de conserver la mise en forme et rajoute de la coloration syntaxique ?

Xavier
0
gdepotter Messages postés 5 Date d'inscription vendredi 21 décembre 2018 Statut Membre Dernière intervention 25 décembre 2018
21 déc. 2018 à 16:03
Classe Movie:

class Movie: 



# ------------------------------------------------------------------------- 

movie_id: int 

movie_imdb: int 

name: str 

actors: List[Actor] 

summary: str 

category: List[str] 



# ------------------------------------------------------------------------- 

def __init__(self, movie_id: int, name: str, category: []): 

self.movie_id = movie_id 

self.movie_imdb = 0 

self.name = name 

self.actors = [] 

self.summary = "" 

self.category = category 

# ------------------------------------------------------------------------- 

def imprimer(self): 

print(movie_id) 

print(name) 

print(category) 


Code pour ajouter l'objet dans la liste:

f = open ('test_movies.csv')
fichier_test = csv.reader(f)
category = []
tous_les_films = []#Liste qui contiendra l'ensemble des films provenant du fichier movies.csv
movieId = 0
for ligne in fichier_test:
    category.clear()
    movie_id = ligne[0]
    name = ligne[1]
    category_ligne = ligne[2]
    
    for mot in category_ligne.split("|"):
        category.append(mot)
        
    film = Movie(movie_id, name, category)
    tous_les_films.append(film) 

for i in tous_les_films:
    i.imprimer()
0
Jithel Messages postés 843 Date d'inscription mercredi 20 juin 2018 Statut Membre Dernière intervention 31 août 2021 171
21 déc. 2018 à 16:13
def imprimer(self): 
   print(self.movie_id) 
   print(self.name) 
   print(self.category) 


Essaye avec ce code
0
gdepotter Messages postés 5 Date d'inscription vendredi 21 décembre 2018 Statut Membre Dernière intervention 25 décembre 2018
21 déc. 2018 à 16:24
Merci beaucoup, ça a déjà résolu un de mes problèmes! Mais les catégories s'affichent toujours mal. Avez-vous une idée?

Ce que la console affiche :

1
Toy Story (1995)
['Comedy']
2
Jumanji (1995)
['Comedy']
3
Grumpier Old Men (1995)
['Comedy']
4
Waiting to Exhale (1995)
['Comedy']
5
Father of the Bride Part II (1995)
['Comedy']

Ce qu'elle devrait afficher :

1
Toy Story (1995)
['Adventure', 'Animation', 'Children', 'Comedy', 'Fantasy']
2
Jumanji (1995)
['Adventure', 'Children', 'Fantasy']
3
Grumpier Old Men (1995)
['Comedy', 'Romance']
4
Waiting to Exhale (1995)
['Comedy', 'Drama', 'Romance']
5
Father of the Bride Part II (1995)
['Comedy']
0
Jithel Messages postés 843 Date d'inscription mercredi 20 juin 2018 Statut Membre Dernière intervention 31 août 2021 171
21 déc. 2018 à 16:52
Il doit y avoir un problème ici :
for mot in category_ligne.split("|"):
        print(mot)
        category.append(mot)


Vérifie que le print(mot) affiche bien toutes les catégories et non Comedy à chaque fois
0
gdepotter Messages postés 5 Date d'inscription vendredi 21 décembre 2018 Statut Membre Dernière intervention 25 décembre 2018
21 déc. 2018 à 16:57
Oui il les affiche bien. Ca ne vient pas de là.
0
Jithel Messages postés 843 Date d'inscription mercredi 20 juin 2018 Statut Membre Dernière intervention 31 août 2021 171
23 déc. 2018 à 07:12
J'ai comme l'impression qu'il manque un
self.category
quelque part dans le code de ta classe. Tu es sûr que tu as mis ce code :
def imprimer(self): 
   print(self.movie_id) 
   print(self.name) 
   print(self.category) 
0
Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié le 24 déc. 2018 à 09:39
Bonjour,

Je ne connais pas bien Python, mais il me semble que le tableau category est toujours le même, réutilisé pour chaque objet. Le category.Clear() ne réinstancie pas un nouveau tableau. Du coup chaque objet fait en fait référence au même tableau Category, qui est vidé et rempli à chaque fois. Ne reste donc à la fin que son dernier contenu.

À mon avis, il faudrait soit remplacer category.Clear() par le code pour instancier un nouveau tableau, soit modifier le __init__ de Movie pour faire une copie de category dans un nouveau tableau, plutôt que de référencer le tableau courant.

Xavier
0
gdepotter Messages postés 5 Date d'inscription vendredi 21 décembre 2018 Statut Membre Dernière intervention 25 décembre 2018
25 déc. 2018 à 20:52
Merci beaucoup à tous. Mon problème est résolu grâce à vous ! :)
0