Domača naloga: Analiza dražbe

Nekateri [who? citation needed?] pravijo, da se na dražbi za vsak izdelek v začetku samo ogrevajo in da je zaželenost izdelka najbolj primerno presojati po tem, za koliko se je dvignila njegova cena v zadnjih sedmih ponudbah.

Napiši program, ki za vsak izdelek pove, koliko se je dvignila njegova cena v zadnjih sedmih ponudbah. Če je bilo vseh ponudb manj kot 7, pa pač v toliko ponudbah, kot jih je bilo.

Pravilni rezultat je

slika  -  14
pozlačen dežnik  -  0
Meldrumove vaze  -  18
skodelice  -  18
kip  -  13
čajnik  -  0
srebrn jedilni servis  -  14
perzijska preproga  -  5

Rešitev - s seznamom za tekoči predmet

trenutni_predmet = ""
cene = []


for vrstica in open("zapisnik.txt"):
    predmet, _, cena = vrstica.split(",")
    if predmet != trenutni_predmet:
        if trenutni_predmet:
            if len(cene) >= 7:  # Tole se da preprosteje - glej spodaj
                print(trenutni_predmet, "-", cene[-1] - cene[-7])
            else:
                print(trenutni_predmet, "-", cene[-1] - cene[0])
        trenutni_predmet = predmet
        cene = []
    cene.append(int(cena))
    
print(trenutni_predmet, "-", cene[-1] - cene[0])
slika - 14
pozlačen dežnik - 0
Meldrumove vaze - 18
skodelice - 18
kip - 13
čajnik - 0
srebrn jedilni servis - 14
perzijska preproga - 5

Spremenljivka trenutni_predmet vsebuje predmet, s katerim se trenutno ukvarjamo (dokler ne preberemo prvega predmeta, bo to prazen niz), cene pa vse cene, ponujene zanj.

Po branju vsake vrstice, preverimo, ali gre za isti predmet kot v prejšnji vrstici. Če ne, potem preverimo, ali je niz trenutni_predmet neprazen: če bi bil, to pomeni, da smo zgolj prebrali prvo vrstico. Če ni prazen, moramo izpisati ime predmeta in povedati, za koliko se je dvignila njegova cena v zadnjih sedmih ponudbah. To načelno dobimo z cene[-1] - cene[-7], vendar za nekatere predmete ni bilo sedmih ponudb. Za takšne računamo razliko med zadnjo in prvo ponudbo.

V primeru, da gre za nov predmet, si zapomnimo novi trenutni izdelek in izpraznimo seznam cen.

V vsakem primeru pa dodamo ceno tega izdelka v seznam.

Zoprni ponovljeni print po zanki poskrbi za zadnji predmet, perzijsko preprogo.

Računanje razlike si lahko malo poenostavimo z rezinami. cene[-7:] vrne zadnjih sedem cen, če ima seznam manj kot sedem elementov, pa pač toliko, kolikor jih je. cene[-7:][0] je potem prva izmed zadnjih sedmih (ali kolikor jih pač je) cen.

trenutni_predmet = ""
cene = []


for vrstica in open("zapisnik.txt"):
    predmet, _, cena = vrstica.split(",")
    if predmet != trenutni_predmet:
        if trenutni_predmet:
            print(trenutni_predmet, "-", cene[-1] - cene[-7:][0])
        trenutni_predmet = predmet
        cene = []
    cene.append(int(cena))
    
print(trenutni_predmet, "-", cene[-1] - cene[-7:][0])
slika - 14
pozlačen dežnik - 0
Meldrumove vaze - 18
skodelice - 18
kip - 13
čajnik - 0
srebrn jedilni servis - 14
perzijska preproga - 5

Zanimiva je tudi rešitev, po kateri v vsakem trenutku hranimo le zadnjih sedem cen.

trenutni_predmet = ""
cene = []


for vrstica in open("zapisnik.txt"):
    predmet, _, cena = vrstica.split(",")
    if predmet != trenutni_predmet:
        if trenutni_predmet:
            print(trenutni_predmet, "-", cene[-1] - cene[0])
        trenutni_predmet = predmet
        cene = []
    cene = (cene + [int(cena)])[-7:]
    
print(trenutni_predmet, "-", cene[-1] - cene[0])
slika - 14
pozlačen dežnik - 0
Meldrumove vaze - 18
skodelice - 18
kip - 13
čajnik - 0
srebrn jedilni servis - 14
perzijska preproga - 5

Rešitev s slovarjem

Če nam gre na živce, da moramo stalno beležiti zadnji predmet in ga primerjati s trenutnim, si lahko pomagamo tako, da vse podatke najprej preberemo v slovar. Ključi bodo predmeti, vrednosti pa seznami cen za ta predmet.

ponudbe = {}  # slovar: ključi so predmeti, vrednosti *seznami* ponudb za ta predmet


for vrstica in open("zapisnik.txt"):
    predmet, _, cena = vrstica.split(",")
    if predmet not in ponudbe:
        ponudbe[predmet] = []
    ponudbe[predmet].append(int(cena))

for predmet, cene in ponudbe.items():
    print(predmet, "-", cene[-1] - cene[-7:][0])
slika - 14
pozlačen dežnik - 0
Meldrumove vaze - 18
skodelice - 18
kip - 13
čajnik - 0
srebrn jedilni servis - 14
perzijska preproga - 5

Resda imamo dve zanki, vendar sta preprostejši. Pa še print po zanki nam ne dela več sramote.