Wyszukiwanie filmów w bazie po tytule

0

Jestem trakcie pisania kodu :

Jak zrobić aby ta funkcja search która jest w klasie library sprawdzała czy wpisany tutuł istniej w tej bazie filmów czyli w tej liście bo tak jak to napisałem to zawsze mi zwraca żę nie ma filmu nawet jak wpisze film z listy library ?

Druga rzecz jak jest def generate_views(self): k = random.choice(self.library) to jak zrobić coś takiego ? "generate_views powinien losować jakiś film z biblioteki i dla niego losowa ilość razy odpalić metodę play która powiększa o 1. Alternatywnie powinno po prostu losowac liczbe i losowo ustawiać dla losowego filmu z biblioteki" jak coś takiego zrobić w tym kodzie?

Polecenie jest poniżej:

Zadanie: biblioteka filmów
A teraz coś z zupełnie innej beczki. Wyobraź sobie, że tworzysz system obsługujący bibliotekę filmów i seriali. Wykorzystaj wiedzę na temat programowania obiektowego i napisz program, który spełnia następujące założenia:

Jest w stanie przechowywać informacje na temat filmów, które znajdują się w systemie. Każdy film powinien mieć następujące atrybuty:
Tytuł
Rok wydania
Gatunek
Liczba odtworzeń
Umożliwia przechowywanie informacji na temat seriali. Każdy serial powinien mieć następujące atrybuty:
Tytuł
Rok wydania
Gatunek
Numer odcinka
Numer sezonu
Liczba odtworzeń
Filmy i seriale mają metodę play, która zwiększa liczbę odtworzeń danego tytułu o 1.
Po wyświetleniu serialu jako string pokazują się informacje o konkretnym odcinku, np.: “The Simpsons S01E05” (gdzie po S pokazany jest numer sezonu w notacji dwucyfrowej, natomiast po E - numer odcinka, również w zapisie dwucyfrowym).
Po wyświetleniu filmu jako string widoczne są tytuł i rok wydania np. “Pulp Fiction (1994)”.
Przechowuje filmy i seriale w jednej liście.
Dodatkowo:

Napisz funkcje get_movies oraz get_series, które będą filtrować listę i zwracać odpowiednio tylko filmy oraz tylko seriale. Posortuj listę wynikową alfabetycznie.
Napisz funkcję search, która wyszukuje film lub serial po jego tytule.
Napisz funkcję generate_views, która losowo wybiera element z biblioteki, a następnie dodaje mu losową (z zakresu od 1 do 100) ilość odtworzeń.
Napisz funkcję, która uruchomi generate_views 10 razy.
Napisz funkcję top_titles(), która zwróci wybraną ilość najpopularniejszych tytułów z biblioteki. Dla chętnych: dodaj do funkcji parametr content_type, którym wybierzesz czy mają zostać pokazane filmy, czy seriale.

kod:

import random

class Movie:
    def __init__(self , title ,publish , type ,play_counter) -> None:
        self.title = title
        self.publish = publish
        self.type = type
        self.play_counter = play_counter = 0
    
    def __repr__(self):
        return f"{self.title}  {self.publish}  {self.type} {self.play_counter}"
    
    
    def play(self ):
        self.play_counter += 1
        
  
    def generate_views(self ):
        self.play_counter *=10
    
class Series(Movie):
    def __init__(self , title , publish , type , play_counter , sezon , episode):
        super().__init__( title , publish , type , play_counter )
        self.sezon = sezon
        self.episode = episode
    def __repr__(self):
        return f" {self.title} {self.publish}  {self.type} {self.play_counter} {self.sezon} {self.episode} "
    
     


class Library:

    def __init__(self):
        self.library =[]
        

    def add(self, object):
        if not (type(object) == Movie or type(object) == Series): raise ValueError("To musi być film lub serial")
        self.library.append(object)
       
        
    def get_movies(self):
          return [i for i in self.library if type(i) == Movie]         
    
    def get_series(self):
          return [i for i in self.library if type(i) == Series]
    

    def generate_views(self):
            
          k  = random.choice(self.library)
        
    def search(self , obj ):
        self.obj = obj
        if self.obj == self.library:
             print(f'Film o podanej nazwie {self.obj} jest w liście filmów')
            
        else:
            print(f'Podany film nie istniej {self.obj}')          
                  
m = Movie("Annabelle" , 2019 , "Horror" , 0)
s = Series("The walking dead", 2022 , "Horror", 0 , "E02" ,"S11")
x = Library()
x.add(m)
x.add(s)
s.generate_views()
m.generate_views()
s.play()
x.search("Annabelle  2019  Horror 0")
 

print(f'Film: {x.get_movies()}')
print(f'Serial: {x.get_series()}')
0

@dawid584:

Masz zniechęcający tytuł, ale treść wskazuje, ze do rozwiązania jest selektywny problem, a my to zdecydowanie bardziej szanujemy

W Searchu porównujesz obj z cała listą library, co nie może dać pozytywnego wyniku, bo koszyk jabłek != jabłko.

Istnieniec zegoś w liście pythionowskiej można sprawdzić słowen in, funkcją index() i pewnie na kilka sposobów.

~~ https://www.geeksforgeeks.org/check-if-element-exists-in-list-in-python/ ~~

opos.... za mało dokładnie napisałem. W sumie co cehsz w czym szukać, ja bym zgadywał ze danej prostej (string) chcesz szukać TYLKO w polu tytuł ?
A to przez nic nieznaczącą nazwę argumentu obj , to się źle czyta

Tu wyglada dosc dobrze

https://bobbyhadz.com/blog/python-find-object-in-list-of-objects#:~:text=To%20find%20an%20object%20in%20a%20list%20of,%28%29%20function%20to%20return%20the%20first%20matching%20object.

0
ZrobieDobrze napisał(a):

@dawid584:

Masz zniechęcający tytuł, ale treść wskazuje, ze do rozwiązania jest selektywny problem, a my to zdecydowanie bardziej szanujemy

W Searchu porównujesz obj z cała listą library, co nie może dać pozytywnego wyniku, bo koszyk jabłek != jabłko.

Istnieniec zegoś w liście pythionowskiej można sprawdzić słowen in, funkcją index() i pewnie na kilka sposobów.

~~ https://www.geeksforgeeks.org/check-if-element-exists-in-list-in-python/ ~~

opos.... za mało dokładnie napisałem. W sumie co cehsz w czym szukać, ja bym zgadywał ze danej prostej (string) chcesz szukać TYLKO w polu tytuł ?
A to przez nic nieznaczącą nazwę argumentu obj , to się źle czyta

Tu wyglada dosc dobrze

https://bobbyhadz.com/blog/python-find-object-in-list-of-objects#:~:text=To%20find%20an%20object%20in%20a%20list%20of,%28%29%20function%20to%20return%20the%20first%20matching%20object.

jak zrobiłem to w ten sposób to też mi nie działa :

 def search(self ,obj):
        self.obj = obj

        for i in self.library:
            if self.obj == i:
               print(f'Film o podanej nazwie {self.obj} jest w liście filmów {self.library}')
               break
            else:
               print(f'Podany film nie istniej {self.obj}')
46

Ja bym Ci zamiast tego zaproponował coś takiego. Baza / szukajka na bazie dziennika.

Najpierw cała struktura jak może np wyglądać film.

from enum import Enum, auto
from dataclasses import dataclass

class MovieType(Enum):
    HORROR = auto()
    COMEDY = auto()
    DRAMA = auto()

@dataclass
class MovieDetails:
    type: MovieType
    year: int

@dataclass
class Movie:
    title: str
    details: MovieDetails

następnie tworzysz sobie klase Library, która realnie jest takim customowym dziennikiem (Wrapujesz sobie magiczne metody w jakieś tam nazewnictwo dla czytelności).

from collections import UserDict

class Library(UserDict):
    def __init__(self):
        super().__init__()
    
    def __setitem__(self, key, item):
        if self.get(key):
            raise ValueError("This movie already exist in db")
        super(Library, self).__setitem__(key, item)
    def add(self, movie: Movie):
        self.__setitem__(movie.title, movie.details)

    def search(self, title: str) -> MovieDetails | None:
        return self.get(title)

No i potem użycie. Tworzysz film i bibliotekę.

def main():
    library = Library()
    m1 = Movie("titanic", MovieDetails(type=MovieType.DRAMA, year=1999))
    
    library.add(m1)
    library.search("titanic")
>> MovieDetails(type=<MovieType.DRAMA: 3>, year=1999)

Na pewno jest to szybsze rozwiązanie w przypadku, gdy będziesz miał pare tysięcy filmów + samo szukanie jest czytelniejsze. OFC jest to tylko przykładowy szablon z podstawowymi funkcjami. Być może wyciągniesz z tego jakąś wartość :P

0

@dawid584: Ogólnie, nie wygląda to dobrze, ale jak już tak, to może:
if self.object in self.library:...
Co do drugiego pytania, Python jest znany z ekspresywności, spróbuj zapisać w kodzie, to co opisałeś...

1 użytkowników online, w tym zalogowanych: 0, gości: 1