Поиск идентификатора в списке книг - PullRequest
0 голосов
/ 21 марта 2019

Я создал простую библиотечную систему, в которой хранятся книги с идентификатором, именем и стоимостью. Мой вопрос довольно прост, но мои ограниченные знания Python подвели меня.

Я создал класс, который хранит книги в библиотеке, они создаются следующим образом;

if __name__ == '__main__':
    lib = Library()
    book1 = Book(1, 'Bookname1', "$30")
    book2 = Book(2, 'Bookname2', "$10")
    book3 = Book(3, 'Bookname3', "$40")

Мне нужно создать функцию, которая ищет книгу по ее идентификатору, сделав функцию в моем классе библиотеки. Я попытался сделать это как в коде ниже, но это не сработало. по сути, я хочу дать своей функции идентификатор, и она должна возвращать название и стоимость этой конкретной книги, но только если идентификатор присутствует в списке.

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):
    #    if ID in lib:
    #        return self.books

    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()

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Я думаю, что самая простая идея, если вам нужно ID индексирование, это использовать словарь :

class Library:
    def __init__(self):
        self.books = dict()

    def add_book(self, Book):
        self.books[Book.ID] = Book

    def remove_book(self, Book):
        del self.books[Book.ID]

    def get_book(self, ID):
        return self.books[ID]

    def show_id(self, ID):
        self.get_book(ID).show()

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

Вы можете даже переименовать get_book в __getitem__, это второе имя является особенным в python, оно называется методом dunder (или магическим методом).Реализация этого позволит вам писать lib[id] вместо lib.show_id(id) (я не говорю, что вы должны, но это вариант).Есть много других более сложных методов, которые вы можете попробовать использовать для развлечения, некоторые из них вы можете найти в модели данных python .

Я думаю, что вы должны опубликовать свой код на codereview , так как вы можете использовать более широкие советы по своему коду.

0 голосов
/ 21 марта 2019

Как отмечалось выше, могут быть более качественные реализации, но используя текущий код, вы можете сделать следующее, где я адаптировал вашу функцию show_id в соответствии с требованиями.Для определения правильных идентификаторов используется список .

Надеюсь, это поможет!

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 голосов
/ 21 марта 2019

Даже если этот метод на самом деле не оптимизирован, вы можете просмотреть их с помощью цикла for.

for book in lib.books:
    if book.id == searched_id:
        searched_book = book
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...