Problème ajout d'un objet dans une liste Python
Résolu
gdepotter
Messages postés
5
Date d'inscription
Statut
Membre
Dernière intervention
-
gdepotter Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
gdepotter Messages postés 5 Date d'inscription Statut Membre Dernière intervention -
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 :
Code pour stocker les films dans la liste :
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 :)
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 :)
A voir également:
- Problème ajout d'un objet dans une liste Python
- Liste déroulante excel - Guide
- Citizen code python avis - Accueil - Outils
- Liste déroulante en cascade - Guide
- Liste code ascii - Guide
- Vente objet occasion entre particulier - Guide
3 réponses
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
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
def imprimer(self): print(self.movie_id) print(self.name) print(self.category)
Essaye avec ce code
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']
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']
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
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
Code pour ajouter l'objet dans la liste: