So, I have problems with sorting something in my code. Here it is what I did until now:
class catalog(object):
lista_obiecte = [] #list_of_objects
clasa = ""
subclasa = ""
def __init__(self):
self.pret = int(input("Pretul produsului: ")) #price
self.consum = int(input("Consumul produsului: ")) #cconsumption
self.producator = input("Producatorul produsului: ") #manufacture
self.cod_produs = int(input("Codul produsului: ")) #series_number
catalog.lista_obiecte.append(self)
class Electrocasnice_mari(catalog):
clasa= "Electrocasnice mari" #big_appliances
def __init__(self):
self.adancime = int(input("Adancimea produsului: ")) #depth
self.inaltime = int(input("Inaltimea produsului: ")) #height
self.latime = int(input("Latimea produsului: ")) #width
catalog.__init__(self)
class frigider(Electrocasnice_mari):
subclasa = "Frigider" #fridge
clasa= "\nElectrocasnice mari"
print(clasa)
print(subclasa)
def __init__(self):
self.capacitate_congelator = int(input("Capacitate congelator: ")) #Capacity of the freezer
self.capacitate_frigider = int(input("Capacitate frigider: ")) #Capacity of the fridge
Electrocasnice_mari.__init__(self)
f1 = frigider()
class aragaz(Electrocasnice_mari):
subclasa= "Aragaz" #Gas cooker
clasa= "\nElectrocasnice mari"
print(clasa)
print(subclasa)
def __init__(self):
self.nr_arzatoare= int(input("Numar de arzatoare: ")) #nr of burners
Electrocasnice_mari.__init__(self)
a1= aragaz()
class Electrocasnice_mici(catalog):
def __init__(self):
clasa= "Electrocasnice mici" #small_appliances
self.lungime_cablu= int(input("Lungimea cablului: ")) #lenght of the cable
self.baterie= int(input("Baterie produs: ")) #battery
catalog.__init__(self)
class mixer(Electrocasnice_mici):
def __init__(self):
subclasa= "Mixer" #Mixer
clasa= "\nElectrocasnice mici"
print(clasa)
print(subclasa)
self.rotatii_min= int(input("Rotatii pe minut: ")) #Rotations per minute
Electrocasnice_mici.__init__(self)
m1= mixer()
class fier_calcat(Electrocasnice_mici):
def __init__(self):
subclasa= "Fier de calcat" #iron
clasa= "\nElectrocasnice mici"
print(clasa)
print(subclasa)
self.rezervor= int(input("Rezervor: ")) #water tank
Electrocasnice_mici.__init__(self)
c1= fier_calcat()
Basically it is a list of four products and their characteristics. What I can't seem to get the hang of is how to sort these four objects, that I added in "lista_obiecte" or "list_of_objects", by the attribute, I think, "consum" or "consumption".
I would really appreciate it if someone would be able to write the code for that part and explain it to me.
Also, this is my output, the numbers are random.
Output:
Electrocasnice mari
Frigider
Capacitate congelator: 78
Capacitate frigider: 45
Adancimea produsului: 54
Inaltimea produsului: 547
Latimea produsului: 71
Pretul produsului: 79
Consumul produsului: 74
Producatorul produsului: 45
Codul produsului: 47
Electrocasnice mari
Aragaz
Numar de arzatoare: 7
Adancimea produsului: 47
Inaltimea produsului: 49
Latimea produsului: 23
Pretul produsului: 10
Consumul produsului: 11
Producatorul produsului: 22
Codul produsului: 33
Electrocasnice mici
Mixer
Rotatii pe minut: 44
Lungimea cablului: 55
Baterie produs: 66
Pretul produsului: 77
Consumul produsului: 88
Producatorul produsului: 99
Codul produsului: 90
Electrocasnice mici
Fier de calcat
Rezervor: 86
Lungimea cablului: 89
Baterie produs: 65
Pretul produsului: 45
Consumul produsului: 42
Producatorul produsului: 15
Codul produsului: 46
A container must implement the methods __lt__, __gt__, __eq__ to be sortable.
With your code and some additions it looks like this:
from functools import total_ordering
@total_ordering
class Catalog(object):
# names of classes should begin with upper case
sort_order = ['pret', 'consum', 'producator', 'cod_produs']
lista_obiecte = [] #list_of_objects
clasa = ""
subclasa = ""
def __init__(self):
self.pret = int(input("Pretul produsului: ")) #price
self.consum = int(input("Consumul produsului: ")) #cconsumption
self.producator = input("Producatorul produsului: ") #manufacture
self.cod_produs = int(input("Codul produsului: ")) #series_number
catalog.lista_obiecte.append(self)
def _get_fields(self):
return tuple(getattr(self, field) for field in self.sort_order)
def __lt__(self, other):
return self._get_fields() < other._get_fields()
def __gt__(self, other):
return self._get_fields() > other._get_fields()
def __eq__(self, other):
return self._get_fields() == other._get_fields()
def __repr__(self):
return f'{self.__class__.__name__}(pret={self.pret})'
# the _get_fields method is just a helper.
# I would not repeat myself.
With Python 3.7 dataclasses were introduced.
They give you the dot-access, the can be sortable and frozen (imutable)
Representation is made automatic. With fields you can also define if a filed should not
be used for sorting. It looks also a little bit cleaner.
You need to know, that you should not overwrite the __init__ method, if you are using dataclasses.
from dataclasses import dataclass
from dataclasses import field
def get_input_with_validation(question, input_type=int, min_val=None, max_val=None):
while True:
data = input(question + ': ')
try:
value = input_type(data)
except ValueError:
print(f'{data} is not a {input_type.__name__}')
continue
if min_val is not None and value < min_val:
print(f'{value} is smaller than {min_val}')
continue
if max_val is not None and value > max_val:
print(f'{value} is bigger than {max_val}')
continue
return value
@dataclass(order=True, frozen=True)
class Item:
pret: int = field()
consum : int = field()
producator: int = field(repr=False)
cod_produs: int = field(repr=False)
@classmethod
def create(cls):
pret = get_input_with_validation("Pretul produsului")
consum = get_input_with_validation("Consumul produsului")
producator = get_input_with_validation("Producatorul produsului")
cod_produs = get_input_with_validation("Codul produsului")
return cls(pret, consum, producator, cod_produs)
The sorted function does the rest.
The order of fields counts also.
With this example the Item is sorted by (price, consum)
and the rest was excluded from sorting.
So, I figured how to do the sorting by "consum" and by "pret". (Thank you ichabod)
Here is the code:
class catalog(object):
lista_obiecte = []
clasa = ""
subclasa = ""
def __init__(self):
self.pret = int(input("Pretul produsului: "))
self.consum = int(input("Consumul produsului: "))
self.producator = input("Producatorul produsului: ")
self.cod_produs = int(input("Codul produsului: "))
catalog.lista_obiecte.append(self)
class Electrocasnice_mari(catalog):
clasa= "Electrocasnice mari"
def __init__(self):
self.adancime = int(input("Adancimea produsului: "))
self.inaltime = int(input("Inaltimea produsului: "))
self.latime = int(input("Latimea produsului: "))
catalog.__init__(self)
class frigider(Electrocasnice_mari):
subclasa = "Frigider"
clasa= "\nElectrocasnice mari"
print(clasa)
print(subclasa)
def __init__(self):
self.capacitate_congelator = int(input("Capacitate congelator: "))
self.capacitate_frigider = int(input("Capacitate frigider: "))
Electrocasnice_mari.__init__(self)
f1 = frigider()
class aragaz(Electrocasnice_mari):
subclasa= "Aragaz"
clasa= "\nElectrocasnice mari"
print(clasa)
print(subclasa)
def __init__(self):
self.nr_arzatoare= int(input("Numar de arzatoare: "))
Electrocasnice_mari.__init__(self)
a1= aragaz()
class Electrocasnice_mici(catalog):
def __init__(self):
clasa= "Electrocasnice mici"
self.lungime_cablu= int(input("Lungimea cablului: "))
self.baterie= int(input("Baterie produs: "))
catalog.__init__(self)
class mixer(Electrocasnice_mici):
def __init__(self):
subclasa= "Mixer"
clasa= "\nElectrocasnice mici"
print(clasa)
print(subclasa)
self.rotatii_min= int(input("Rotatii pe minut: "))
Electrocasnice_mici.__init__(self)
m1= mixer()
class fier_calcat(Electrocasnice_mici):
def __init__(self):
subclasa= "Fier de calcat"
clasa= "\nElectrocasnice mici"
print(clasa)
print(subclasa)
self.rezervor= int(input("Rezervor: "))
Electrocasnice_mici.__init__(self)
c1= fier_calcat()
for x in sorted(catalog.lista_obiecte,key = lambda x: x.consum):
print ("consumul produsului", x.subclasa,"este", x.consum)
for y in sorted (catalog.lista_obiecte,key = lambda y: y.pret):
print ("Pretul produsului", y.subclasa, "este", y.pret)
input("\nApasa <enter> pentru a iesi")
But at the output it shows like this:
Output:
Electrocasnice mari
Frigider
Capacitate congelator: 78
Capacitate frigider: 45
Adancimea produsului: 69
Inaltimea produsului: 45
Latimea produsului: 12
Pretul produsului: 32
Consumul produsului: 456
Producatorul produsului: 79
Codul produsului: 46
Electrocasnice mari
Aragaz
Numar de arzatoare: 13
Adancimea produsului: 20
Inaltimea produsului: 45
Latimea produsului: 990
Pretul produsului: 36
Consumul produsului: 66
Producatorul produsului: 44
Codul produsului: 99
Electrocasnice mici
Mixer
Rotatii pe minut: 88
Lungimea cablului: 33
Baterie produs: 11
Pretul produsului: 22
Consumul produsului: 55
Producatorul produsului: 44
Codul produsului: 77
Electrocasnice mici
Fier de calcat
Rezervor: 88
Lungimea cablului: 80
Baterie produs: 81
Pretul produsului: 71
Consumul produsului: 74
Producatorul produsului: 75
Codul produsului: 76
consumul produsului este 55 #The consumption of the product is
consumul produsului Aragaz este 66
consumul produsului este 74
consumul produsului Frigider este 456
Pretul produsului este 22 #The price of the product is
Pretul produsului Frigider este 32
Pretul produsului Aragaz este 36
Pretul produsului este 71
Apasa <enter> pentru a iesi
If you can observe it only shows the name("subclasa" in my program) for "frigider" and "aragaz". What did I do wrong?
For frigider and aragaz, subclasa is defined outside the __init__ method but inside the class, so it is a class attribute, which is stored for later use. For the others, subclasa is defined in the __init__ method (without using self), so they are just local variables that go away after the __init__ method executes. You either need to define them as self.name = value, or move them out of the __init__ method like the other two.
# Proiect Python curs incepatori-BITAcademy
# Catalog electrocasnice
# Catalog 05.04.2020
# I have this error :TypeError: __init__() missing 6 required positional arguments: 'consum', 'producator', 'cod_produs', 'adancime', 'latime', and 'inaltime'.
What is wrong?
class Catalog:
# 1b.
lista_obiecte = []
clasa = ""
subclasa = ""
def __init__(self, pret, consum, producator, cod_produs): # 1a
self.pret = pret
self.consum = consum
self.producator = producator
self.cod_produs = cod_produs
Catalog.lista_obiecte.append(self) # 1b
def sorteaza_dupa_pret(self):
for obiect in sorted(Catalog.lista, key=lambda obiect: obiect.pret):
print("\n Sortare dupa pret:")
print("Pretul produsului:", obiect.pret)
#print ("Pretul produsului", obiect.subclasa, "este", obiect.pret)
print(self.pret)
pass
# alegeti voi ce afisati
def sorteaza_dupa_consum(self):
for obiect in sorted(Catalog.lista, key = lambda obiect: obiect.consum):
print("\n Sortare dupa consum:")
print("Consumul produsului:", obiect.consum)
#print ("Consumul produsului", obiect.subclasa, "este", obiect.consum)
print(self.consum)
pass
def sorteaza_dupa_producator(self):
for obiect in sorted(Catalog.lista, key = lambda obiect: obiect.producator):
print("\n Sortare dupa producator:")
print("Producatorul produsului:", obiect.producator)
#print ("Producatorul produsului", obiect.subclasa, "este", obiect.producator)
print(self.producator)
pass
def cauta_subclasa(self):
prod = input("Ce produs cautati?")
for obiect in []:
print("Ce vreti voi")
class Electrocasnice_mari(Catalog):
def __init__(self,pret,consum,producator,cod_produs,adancime,latime,inaltime): # parametrii pe care ii primeste clasa parinte
super().__init__("Catalog")
clasa= "Electrocasnice mari"
Catalog.clasa = "\nElectrocasnice mari" # populare variabila clasa
super().__init__(pret,consum,producator,cod_produs,adancime,latime,inaltime)
self.adancime = adancime
self.latime = latime
self.inaltime = inaltime
self.cod_produs = cod_produs
class Electrocasnice_mici(Catalog):
clasa = "Electrocasnice_mici"
def __init__(self,pret,consum,producator,cod_produs,lungime_cablu, baterie): # parametrii pe care ii primeste clasa parinte
Catalog.clasa = "\nElectrocasnice mici" # populare variabila clasa
super().__init__(pret,consum,producator,cod_produs)
self.lungime_cablu = lungime_cablu
self.baterie = baterie
class frigider(Electrocasnice_mari):
clasa = "\nElectrocasnice_mari"
subclasa = "frigider" # populare variabila clasa
print(clasa)
print(subclasa)
def __init__(self, pret, consum, producator, cod_produs, adancime, latime, inaltime, capacitate_congelator, capacitate_frigider): # parametrii pe care ii primeste clasa parinte
super().__init__(pret, consum, producator, cod_produs, adancime, latime, inaltime, capacitate_congelator, capacitate_frigider)
self.capacitate_congelator = capacitate_congelator
self.capacitate_frigider = capacitate_frigider
Electrocasnice_mari.__init__(self)
frigider1 = frigider()
frigider1 = frigider((1, "2000 ron","80 w","Samsung","45cm","70cm","200cm","100 l","150 l")) #Fridge1
frigider1 = frigider((2, "1500 ron","75 w","Zanussi","40cm","65cm","180cm","80 l","130 l")) #Fridge2
frigider1.sorteaza_dupa_pret()
frigider1.sorteaza_dupa_producator()
frigider1.sorteaza_dupa_consum()
lista_frigidere = [frigider1, frigider2]
for x in lista_frigidere:
print(x)
class aragaz(Electrocasnice_mari):
clasa = "\nElectrocasnice_mari"
subclasa = "\nAragaz" # populare variabila subclasa
print(clasa)
print(subclasa)
def __init__(self,pret,consum,producator,cod_produs,adancime,latime,inaltime,nr_arzatoare): # parametrii pe care ii primeste clasa parinte
super().__init__(pret,consum,producator,cod_produs,adancime,latime,inaltime)
self.nr_arzatoare = nr_arzatoare
#Catalog.subclasa = "\nElectrocasnice_mari" # populare variabila clasa
Electrocasnice_mari.__init__(self)
aragaz1 = aragaz()
pass
#def sub_aragaz(self, b):
# print('Printing from class Aragaz:', b)
# super().sub_aragaz(b + 1)
class Mixer(Electrocasnice_mici):
clasa = "\nElectrocasnice_mici"
subclasa = "\nMixer" # populare variabila subclasa
print(clasa)
print(subclasa)
def __init__(self,pret,consum,producator,cod_produs,lungime_cablu, baterie,rotatii_min): # parametrii pe care ii primeste clasa parinte
super().__init__(pret,consum,producator,cod_produs,lungime_cablu, baterie)
self.rotatii_min = rotatii_min
# fara input()!!!!!
Catalog.subclasa = "\nElectrocasnice_mici" # populare variabila clasa
Electrocasnice_mici.__init__(self)
mixer1 = mixer()
pass
class Fier_calcat(Electrocasnice_mici):
clasa = "\nElectrocasnice_mici"
subclasa = "\nFier_calcat" # populare variabila subclasa
print(clasa)
print(subclasa)
def __init__(self,pret,consum,producator,cod_produs,lungime_cablu, baterie,rezervor): # parametrii pe care ii primeste clasa parinte
super().__init__(pret,consum,producator,cod_produs,lungime_cablu,baterie)
self.rezervor = rezervor
Catalog.subclasa = "\nElectrocasnice_mici" # populare variabila clasa
Electrocasnice_mici.__init__(self)
fier1 = fier_calcat()
pass
aragaz1 = Aragaz("850 ron","68 w","Samsung",3,"50cm","60cm","85", "3 arzatoare")
aragaz2 = Aragaz("1150 ron","62 w","Zanussi",4,"40cm","60cm","80cm","4 arzatoare")
aragaz1.sorteaza_dupa_pret()
aragaz1.sorteaza_dupa_producator()
aragaz1.sorteaza_dupa_consum()
mixer1 = Mixer("150 ron","1400 w","Rowenta",5,"2 metri","fara baterie","1000 rotatii")
mixer2 = Mixer("150 ron","1200 w","Bosch",6,"2 metri","acumulator","1200 rotatii")
mixer1.sorteaza_dupa_pret()
mixer1.sorteaza_dupa_producator()
mixer1.sorteaza_dupa_consum()
fier_calcat1 = Fier_calcat("500 ron","5w","Bosch", 7 , "2 metri","acumulator","600 ml")
fier_calcat2 = Fier_calcat("300 ron","5w","Rowenta", 8 ,"2 metri","acumulator","500 ml")
fier_calcat1.sorteaza_dupa_pret()
fier_calcat1.sorteaza_dupa_producator()
fier_calcat1.sorteaza_dupa_consum()
obiect.sorteaza_dupa_producator()
obiect.sortare_dupa_pret()
obiect.sortare_dupa_consum()
for z in catalog.lista_obiecte:
producator = input ("Introduceti un producator: ") #Insert a maker
for producator in catalog.lista_obiecte:
if (z.producator == producator):
print (z.subclasa)
else:
print ("Nu exista produs cu acest producator") #This maker doesn't exist
input("\nApasa <enter> pentru a iesi")