Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
sorting
#1
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
Reply
#2
Use the key parameter to sort, and provide a function that pulls out the consum attribute:

catalog.lista_obiecte.sort(key = lambda x: x.consum)
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#3
Hi, thanks ichabod for showing me how to sort it. I was wondering if you could also help me putting this in my actual code, I would really much appreciate it.
Reply
#4
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.
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply
#5
(Jul-26-2019, 04:18 AM)AG17 Wrote: I was wondering if you could also help me putting this in my actual code, I would really much appreciate it.

We like to see some effort around here. Why don't you try putting it in your code. If you have problems, let me know what they are, and I'll help you solve them.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#6
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?
Reply
#7
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.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#8
# 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")
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020