0
votes

Recherche d'un identifiant dans une liste de livres

J'ai fait un système de bibliothèque simple qui stocke des livres avec un identifiant, un nom et un coût. Ma question est plutôt simple mais ma connaissance limitée de Python m'a laissé tomber.

J'ai créé une classe qui stocke des livres dans la bibliothèque, ils sont créés comme ceci; xxx

Je dois faire une fonction qui recherche un livre par son ID, en faisant une fonction dans ma classe de bibliothèque. J'ai essayé de le faire comme dans le code ci-dessous, mais cela n'a pas fonctionné. Fondamentalement, je veux donner à ma fonction une carte d'identité et il devrait renvoyer le nom et le coût de ce livre particulier, mais uniquement si l'ID est présent dans la liste. xxx


0 commentaires

3 Réponses :


2
votes

Je pense que l'idée la plus simple si vous avez besoin ID indexation consiste à utiliser un Dictionnaire : xxx

Vous pouvez même renommer get_book à __ getItem __ , ce deuxième nom est spécial à Python, il s'appelle une méthode de Dunder. (ou méthode magique). La mise en œuvre vous permettra d'écrire lib [id] au lieu de lib.show_id (id) (Je ne dis pas que vous devriez, mais c'est une option). Il existe de nombreuses autres méthodes de Dunder que vous pouvez essayer d'utiliser pour vous amuser, vous pouvez en trouver certains dans le Modèle de données Python .

Je pense que vous devriez publier votre code sur codereview , comme vous pouvez utiliser des conseils plus larges sur votre code.


3 commentaires

Dang tu m'as battu! Si je me souviens bien, vous l'avez eu comme une liste à l'origine, alors j'ai commencé à écrire cela, alors vous avez édité haha ​​bien cependant!


Nice One, Nitpick que OP souhaitait retourner retourner le nom et le coût de ce livre particulier , pas l'objet complet du livre, par exemple en retournant ou en tuple.


Maintenant que j'y pense, je pense (donner le nom de la méthode) que l'objectif était d'appeler .show () sur un livre donné à l'aide de son ID , let moi savoir si ce n'est pas le cas.



-1
votes

Même si cette méthode n'est pas vraiment optimisée, vous pouvez les parcourir avec une boucle pour la boucle.

for book in lib.books:
    if book.id == searched_id:
        searched_book = book
        break


0 commentaires

0
votes

Comme indiqué ci-dessus, il pourrait y avoir de meilleures implémentations, mais en utilisant votre code actuel, vous pouvez faire ci-dessous où j'ai adapté votre fonction show_id code> en fonction des exigences. Il repose sur un compréhension de la liste pour identifier les identifiants corrects.

J'espère que cela aide! P>

class Book:

    def __init__(self, ID, name, price):
        self.ID = ID
        self.name = name
        self.price = price

    def show(self):
        print(self.ID, self.name, self.price)

    def get_attribute_string(self):
        print(str(self.ID) + '_' + str(self.name) + '_' + str(self.price))

    def get_id(self):
        print(self.ID)

    def get_name(self):
        print(self.name)

    def get_price(self):
        print(self.price)


class Library:
    def __init__(self):
        self.books = []

    def add_book(self, Book):
        self.books.append(Book)

    def remove_book(self, Book):
        self.books.remove(Book)

    def show_id(self, ID):
        # simple list comprehension to filter; note that you might need to make sure that e.g. all IDs are int, or str
        matching_ids = [book for book in self.books if book.ID == ID]
        # return name, price tuple for all matching books as requested -- note that this will return a list of all matches
        # if the IDs are truly unique, you can return e.g. a single tuple or Book object here
        # if nothing found, will return empty list
        return [(book.name, book.price) for book in matching_ids]


    def show_all(self):
        for Book in self.books:
            Book.show()



if __name__ == '__main__':
    lib = Library()
    book1 = Book(1, 'Bookname1', "$30")
    book2 = Book(2, 'Bookname2', "$10")
    book3 = Book(3, 'Bookname3', "$40")
    #1.show_id
    lib.add_book(book1)
    lib.add_book(book2)
    lib.add_book(book3)
    lib.remove_book(book2)
    lib.show_all()
    print(lib.show_id(1))


0 commentaires