» »

Python - pomoč

Python - pomoč

«
1
2 3

Anja91 ::

Živjo, bi mi lahko kdo pomagal s tole nalogo in mi poslal na privatno sporočilo?

Sestavi razred WordDict, ki se bo vedel podobno kot slovar, vendar bo predpostavljal, da so ključi nizi in bo pri indeksiranju zanemaril razliko med malimi in velikimi črkami. Če je torej velikosti nek takšen slovar in napišemo velikosti["Ana"] = 165, lahko do tega elementa pridemo z velikosti["Ana"], velikosti["ana"], velikosti["ANA"], ali, recimo, velikosti["AnA"]. Razliko med velikostmi črk zanemarjamo tudi pri prirejanju: če gornjemu slovarju priredimo velikosti["aNA"] = 170, nova vrednost povozi staro, čeprav smo imeli prej "Ana" in zdaj "aNA".

Poleg tega naj WordDict podpira tudi metode keys, values in items, ki morajo delati isto kot pri običajnem slovarju; ključi, ki jih vračajo, morajo biti takšni, ko smo jih podali (v gornjem primeru torej "Ana").

Slovar naj podpira tudi operator len: možno naj bo torej poklicati len(velikosti).

Način, na katerega rešite nalogo, je v celoti prepuščen vam: novi slovar smete izpeljati iz starega, lahko ga definirate na novo, ali kaj tretjega.

Dodano: Slovarjev konstruktor (__init__) naj kot argument sprejme seznam parov (kljuc, vrednost) in jih shrani.

Namig, če slučajno ne veste: če želimo pri dveh nizih zanemariti velikost črk, primerjamo tadva niza, pretvorjena v same male črke.


Vsem bom zelo hvaležna!

Mavrik ::

A domačo nalogo ti kar na ZS naj rešimo? Kaj če bi raje to tvojemu učitelju poslali? ;)

Daj raje pokaži kaj si sama probala in ti lahko povemo kje so napake.
The truth is rarely pure and never simple.

Anja91 ::

Nekako se ne znam niti lotit..

Noben? :)

Zgodovina sprememb…

  • spremenilo: Anja91 ()

jype ::

Saj je v opisu naloge že opis rešitve!

FrEaKmAn ::

lepa naloga, škoda ker mi nikoli nismo imeli kaj takega :)

1. nauči se kako narediš razred - http://docs.python.org/tutorial/classes...
2. naučiš se kako shranjevat vrednosti v slovar preko __setattr__ - http://www2.lib.uchicago.edu/keith/cour...
3. naučiš se kako pretvoriti niz v same male črke - http://docs.python.org/library/stdtypes...
4. naučiš se kako dobiš velikost preko __len__ - http://docs.python.org/reference/datamo...
5. napišeš 3 metode (keys, values in items) .. več o tem ko rpideš do sem...

Zgodovina sprememb…

  • spremenil: FrEaKmAn ()

golobich ::

Vbistvu sem ti že napisal rešitev, pol sm se pa odloču da ti jo rajši ne pokažem. Zakaj? Vrjetno zaradi tega, ker če bi poslala e-mail asistentu ali pa celo prof. Demšarju, bi ti verjetno pomagal. Še vedno so pomagali, tako da. Žau. Ti jutri pokažem rešitev ;)

Drugače pa popravek posta od FrEaKmAn-a:
Točka 2: vrednosti shraniš v slovar preko __setitem__ dobiš jih pa z __getitem__ ;)

Lp, golobich

golobich ::

evo je :)
Daljša rešitev:
class WordDict:
    def __init__(self, seznam):
        self.dict = {}
        for kljuc, vrednost in seznam:
            self.__setitem__(kljuc, vrednost)
    def __getitem__(self, item):
        for kljuc in self.dict:
            if kljuc.lower() == item.lower():
                return self.dict[kljuc]
    def __setitem__(self, key, value):
        for kljuc in self.dict:
            if kljuc.lower() == key.lower():
                del self.dict[kljuc]
                break
        self.dict[key] = value
    def __len__(self):
        return len(self.dict)
    def keys(self):
        return [x for x in self.dict] //lahko tudi return self.dict.keys()
    def values(self):
        return [self.dict[x] for x in self.dict] //lahko tudi return self.dict.values()
    def items(self):
        return zip(self.keys(), self.values()) //lahko tudi return self.dict.items()


in pa rešitev z dedovanjem:

class WordDict(dict):
    def __init__(self, seznam):
        for a, b in seznam:
            self.__setitem__(a, b)
    def __getitem__(self, item):
        for kljuc in self.keys():
            if kljuc.lower() == item.lower():
                return dict.__getitem__(self, kljuc)
    def __setitem__(self, key, value):
        for kljuc in self.keys():
            if kljuc.lower() == key.lower():
                del self[kljuc]
                break
        dict.__setitem__(self, key, value)

Zgodovina sprememb…

  • spremenil: golobich ()

Anja91 ::

Ker ste mi prejšnjič pomagali, bi vas tudi sedaj prosila za kakšen namig pri reševanju naloge(torej ne rešitev). Navodilo je tako:

Sestavite program za shranjevanje in iskanje podatkov "kontaktov". Podatke lahko shranjuje v poljubni obliki - kot besedilna datoteka v poljubni obliki (lahko, recimo, vsaka vrstica predstavlja eno osebo, podatki so ločeni s tabulatorji), datoteka XML, Excelova datoteka, Pythonov pickle, podatkovna baza (SQLite, ki je priložen Pythonu ali pa kak pravi SQL)...

Uporabniški vmesnik naj bo narejen v Qtju. Prikazuje naj, v ločenih poljih, ime, priimek, telefonsko številko in elektronski naslov osebe. Omogoča naj dodajanje in spreminjanje podatkov in iskanje (zadošča, recimo, iskanje po imenu). Program naj bo zmožen začeti "na prazno", brez vnaprej pripravljenih podaktov. Izgled uporabniškega vmesnika je prepuščen vam; kdor zna, naj uporabi tabelo (QTableWidget), saj je tako najlepše in najpreprostejše.

hvala.

Spura ::

Ne razumem kaj tocno naj bi bil tle namig, naloga ne vsebuje nobenega problema, ampak je preprosto navodilo kaj moras narest.

Isotropic ::

v katerem programu delate s qt? al pisete kodo rocno?

Anja91 ::

Python, PyQT GPL

Isotropic ::

a na roko pisete pyqt kodo?

Anja91 ::

ja

Anja91 ::


import math

from PyQt4 import QtCore, QtGui
import PyQt4.uic

app = QtGui.QApplication([])
dlg = PyQt4.uic.loadUi("top.ui")

def izracun():
    hitrost = float(dlg.leHitrost.text())
    kot = float(dlg.leKot.text())
    razdalja = hitrost**2 * math.sin(2*math.radians(kot)) / 9.81
    dlg.lbIzracun.setText("Krogla bo letela {:.2f} m".format(razdalja))

QtCore.QObject.connect(dlg.btIzracun, QtCore.SIGNAL("clicked()"), izracun)

dlg.show()
app.exec()



HM..npr. pozenem tale primer, ki ga je dal profeor, pa mi napise: ImportError: DLL load failed: %1 is not a valid Win32 applicaation.

Kaj naj bi bil problem?

Zgodovina sprememb…

  • spremenil: Mavrik ()

Spura ::

Najbrz ne nalozi pravega Qt DLLja.

http://www.lmgtfy.com/?q=ImportError%3A...

Zgodovina sprememb…

  • spremenil: Spura ()

miha90 ::

Python: Kako bi lahko v file-u izbrisal vrstico (ali pa vsaj zamenjal poljuben del vrstice s stringom)?

Zgodovina sprememb…

  • spremenil: miha90 ()

jype ::

miha90> Python: Kako bi lahko v file-u izbrisal vrstico (ali pa vsaj zamenjal poljuben del vrstice s stringom)?

V tekstovni datoteki? A veš številko vrstice, ali iščeš določen niz v njej?

miha90 ::

ja, v txt datoteki. Tisto vrstico ki ustreza pogoju, recimo
 eno_ime="jozek"
          if eno_ime in line:
            zbrisi to vrstico


ali pa da bi ta "eno_ime" dobil "drugo_ime" ki ga določim

Anja91 ::

Torej, je kdo tako prijazen, da mi pomaga začeti, ker sama nevem kako.

hvala

FrEaKmAn ::

Anja91, ti je Spura objavil rešitev (oziroma eno od možnih). Drugače pa http://stackoverflow.com/questions/4676... . Da ne bomo govoril napačnih stvari, zaženi command prompt (run -> cmd.exe) ter vpiši python. Ti bo izpisal katero verzijo imaš, to prepriši sem gor pa nadaljujemo reševat težavo...

Anja91 ::

Python 3.2

FrEaKmAn ::

še kj mora pisat :) vse napiš...

Anja91 ::

'Python' is not recognized as an internal or external command, operable program or batch file.

Če ga napišem v cmd..

Anja91 ::

Ok, ta problem sem rešila. Bi mi kdo prosim pomagal z nalogo. (:

golobich ::

from PyQt4 import QtCore, QtGui
import PyQt4.uic

app = QtGui.QApplication([])
dlg = PyQt4.uic.loadUi("C:\\Users\\Tadej\\PycharmProjects\\Domace naloge\\obrazci\\iskanje.ui")

def obstaja(ime, priimek):
    f = open("imenik.txt", "rt")
    vsebina = f.readlines()
    for i in range(len(vsebina)):
        if ime in vsebina[i] and priimek in vsebina[i]:
            del vsebina[i]
            break
        i+=1
    f.close()
    f = open("imenik.txt", "wt")
    for x in vsebina:
        f.write(x)
    f.close()

def izbrisi():
    dlg.leIme.clear()
    dlg.lePriimek.clear()
    dlg.leTelefon.clear()
    dlg.leMail.clear()

def shrani():
    obstaja(dlg.leIme.text(), dlg.lePriimek.text())
    if dlg.leIme.text() and dlg.lePriimek.text() and dlg.leTelefon.text() and dlg.leMail.text():
        f = open("imenik.txt", "at")
        f.write(dlg.leIme.text() + ";" + dlg.lePriimek.text() + ";" + dlg.leTelefon.text() + ";" + dlg.leMail.text() + "\n")
        f.close()
        izbrisi()
        dlg.lbSporocilo.setText("Podatki shranjeni!")
    else:
        dlg.lbSporocilo.setText("Vsa polja morajo biti izpolnjena!")

def iskanje():
    if dlg.leIskanje.text():
        isci = dlg.leIskanje.text()
        for vrstica in open("imenik.txt", "rt"):
            vrstica = vrstica.split(";")
            if isci in vrstica:
                dlg.leIme.setText(vrstica[0])
                dlg.lePriimek.setText(vrstica[1])
                dlg.leTelefon.setText(vrstica[2])
                dlg.leMail.setText(vrstica[3])
                dlg.leIskanje.clear()
                break
QtCore.QObject.connect(dlg.pbShrani, QtCore.SIGNAL("clicked()"), shrani)
QtCore.QObject.connect(dlg.pbIskanje, QtCore.SIGNAL("clicked()"), iskanje)
dlg.show()
app.exec_()


Sm to rešitev že majo eni,...tak da če to napišeš te profesor dobi da si prepisala. Spremeni jo :)

Anja91 ::

Mi lahko kdo pove(ni naloga, ampak sem se tako sparvila nekaj delat), kako napisati da mi ne vrze 2h enakih stevilk. Npr sem napisala da mi da program 4 random izbrane stevilke, ampak nocem da se pojavljajo enake npr: 123 4 123 76?

-Neverhood- ::

narediš prazno tabelo, potem pa s for zanko generiraš random števila in jih vpisuješ v tabelo ter vmes daš še pogoj, da se sprehodi po tabeli (od začetka do trenutne vrednosti) in pogleda če generirano število že obstaja...

Anja91 ::

Kako? Ne razumem čisto. Mislim razumem že, vendar mi ne gre spisati.

for stevilke in range(1,8):
stevilke = random.randint(1,39)
print (stevilke)
tako imam in mi vrže 7 stevilk.

jeti51 ::

Naredi seznam vseh 39-ih števil v bobnu, uporabi ustrezno funkcijo iz modula random, da ta seznam števil premešaš (dobiš naključno permutacijo), nato pa vzemi prvih 8 števil tega seznama.
Kakšna dodatna tabela, lepo vas prosim, uporabljajte tisto, kar vam Python že sam po sebi nudi.

Zgodovina sprememb…

  • spremenil: jeti51 ()

Spura ::

-Neverhood- je izjavil:

narediš prazno tabelo, potem pa s for zanko generiraš random števila in jih vpisuješ v tabelo ter vmes daš še pogoj, da se sprehodi po tabeli (od začetka do trenutne vrednosti) in pogleda če generirano število že obstaja...

O(n) resitev.

Boljsa resitev ce imas majhen razpon stevil:
boolean array dolzine 39 in si oznacujes katera stevila ze uporabljas
Boljsa resitev ce imas velik razpon stevil:
stevila vstavljas v hashset in s tem preverjas podvojenost
To je kar se tice preprecevanja vstavljanja dveh istih stevil v seznam.
In potem, ko dejansko ugotovimo da gre za loto:
Naredi seznam vseh 39-ih števil v bobnu, uporabi ustrezno funkcijo iz modula random, da ta seznam števil premešaš (dobiš naključno permutacijo), nato pa vzemi prvih 8 števil tega seznama.

Ta resitev je najboljsa, ker je semanticno najblizje temu kar program dejansko dela, ceprav morda ni performancna.

golobich ::

Še ena rešitev
seznam = []
for x in range(1, 10):
    neki = random.randint(1, 39)
    if not neki in seznam:
        seznam.append(neki)
    else:
        x -=1

-Neverhood- ::

Pythona že nekaj časa nisem povohal...

Anja se je zgleda komaj naučila napisati stavek "Hello world", zato sem ji napisal zelo enostaven primer programa. Tak ki ga ponavadi profesor najprej napiše.

Vem da to ni najhitrejša rešitev, vendar glede na to, da ne zna napisati niti tisto kar sem ji napisal, ne moreš pričakovati, da bo uporabljala neke hashset-e in podobne stvari...

golobich je napisal kar sem imel v mislih

FrEaKmAn ::

to kar je golobich napisal ne deluje, nevem kaj je poanta tistega x -= 1

import random

numbers = set()
while len(numbers) < 8:
    random_number = random.randint(1, 39)
    numbers.add(random_number)
    
print numbers


moja koda in obrazložitev. Poanta naloge je da nekaj izvajaš dokler ne izpolneš nekega pogoja - v našem primeru da imamo 8 (ali kokr koli že je) neponavljajočih števil.

numbers = set()


Poznaš set? set je zelo podoben navadnemu seznamu - ena od ralzik je da hrani samo različna števila oziroma vrednosti.

Za navadni seznam npr [1 2] če dodamo 1 bomo dobili [1 2 1]. Če uporabimo set bomo dobili samo [1 2], saj 1 že obstaja notri in ne doda. Pač logika je, nam avtomatsko pogleda še taka število že obstaja notri in če ne ga doda, če ja pa ga ne doda.

while len(numbers) < 8:


to je ta naš pogoj, nekaj izvajamo dokler nimamo nimamo 8 ali več naključnih števil.

    random_number = random.randint(1, 39)
    numbers.add(random_number)


Torej ustvarimo neke naključno število med 1 in 39 ter ga dodamo v seznam. Tukaj je zdaj vsa poanta. Če je ustvaril tako število, ki že obstaja, potem ga ne doda v set in dolžina ostane ista, ane? In naš pogoj zgoraj < 8 ostane še vedno izpolnjen.

Upam da bo to kaj v pomoč, težko razlagat te stvari preko neta...

golobich ::

FrEaKmEaN, point tistega x -=1 je ta: Probi brez tistega napisat. Razlika je očitna. Ona bi rada imela v tabeli predvidevam da vedno 8 števil, zato se včasih ko št že obstaja v seznamu, zanka obrne in naredi nič...se pravi ne bo 8 števil v seznamu. Tist x -=1 samo poskrbi da je vedno v seznamu 8 števil, nič drugega. Je pa res da se prvič ta else nemore izvest, zato do napake ala list index out of range ne bo prišlo.

Je pa res da je to čisto začetniška rešitev

FrEaKmAn ::

vem kaj si poskušal doseči samo to ne deluje.. probaj :)

še ena rešitev, mogoče boljša...

import random
numbers = range(1, 40)
random.shuffle(numbers)
print numbers[:8]


ustvari seznam števil od 1 do 39 vključno, jih zmeša in zbere prvih 8...

Spura ::

golobich pac tako zavrti nazaj indeks za 1 in kao podaljsa for loop za eno iteracijo. Jst sicer ne poznam pythona ampak dvomim da to sploh dela tko kot on misli. Jst predvidevam da range(1, 10) vrne neko sekvenco s tolikimi elementi, in potem for zanka zaporedoma jemlje stevila iz sekvence in jih prireja x in spreminjanje spremenljivke x najbrz nic ne spremeni stevila iteracij. Ne poznam pythona ampak predvidevam da je tko.
Poleg tega tle ni nobenega razloga, da bi clovek uporabljal for zanko namesto while, ce se ze gremo to.

FrEaKmAn ::

haha, evo še rešitev v eni vrstici :)

print random.sample(range(1, 40), 8)

Zgodovina sprememb…

  • spremenil: FrEaKmAn ()

golobich ::

To kar sem jaz napisal dejansko dela.
Okolje: PyCharm 1.5
Python 3.2.2

Rokm ::

import random
import sys

print(sys.version)

def random_seznam():
  seznam = []
  for x in range(1, 10):
    neki = random.randint(1, 39)
    if not neki in seznam:
      seznam.append(neki)
    else:
      x -=1
  return seznam

for _ in range(10):
  print(len(random_seznam()))


>python3.2 random.py
3.2.2 (default, Jan 14 2012, 01:11:39) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)]
9
9
7
8
7
9
9
9
8
9


Si testiral na premalo primerih?

Spura ::

golobich je izjavil:

To kar sem jaz napisal dejansko dela.
Okolje: PyCharm 1.5
Python 3.2.2

Dej mi razlozi logiko zakaj bi to delalo. Range vrne listo. For zanka pobira elemente iz liste. Zakaj bi spreminjanje pobranega elementa vplivalo na stevilo iteracij?
V cem je list zaporednih stevilk magicen za for zanko, da lahko nekaj takega naredis, for x in ['bla', 'bla bla'] pa ne morem nazaj postavljat iteracij. Zakaj bi bila razlika?

golobich ::

Ok, pokažem kodo ki sem jo dejansko jaz napisal, brez funkcije pa potem povej al dela al ne.
Torej koda:
import random
seznam = []
for x in range(1, 10):
    neki = random.randint(1, 5)
    if not neki in seznam:
        seznam.append(neki)
    else:
        x -=1
print(seznam)


Rezultat:
C:\Python32\python.exe "C:/Users/Tadej/PycharmProjects/Domace naloge/chainJerry.py"
[1, 4, 5, 2, 3]

Process finished with exit code 0


Moglo bi bit več cifr, ampak, če bi jih blo več bi se kera cifra ponovila, tako da se zanka konča! Jasno???
Če dam več cifr:

import random
seznam = []
for x in range(1, 10):
    neki = random.randint(1, 39)
    if not neki in seznam:
        seznam.append(neki)
    else:
        x -=1
print(seznam)


Rezultat:
C:\Python32\python.exe "C:/Users/Tadej/PycharmProjects/Domace naloge/chainJerry.py"
[24, 39, 8, 13, 9, 2, 32, 36]

Process finished with exit code 0



Torej???

Rokm ::

lol :)
Ne dela, for zanka gre čez 9 iteracij ti imaš v seznamu pa le 8 števil.

golobich ::

Rokm je izjavil:

lol :)
Ne dela, for zanka gre čez 9 iteracij ti imaš v seznamu pa le 8 števil.


Wow,...nism niti opazu :) Hvala ;)

BigWhale ::

for x in range(1, 10):
    neki = random.randint(1, 39)
    if not neki in seznam:
        seznam.append(neki)
    else:
        x -=1


V pythonu in v tem primeru morda ne ampak nekega dne, te bo taksna koda ubila. Raje se jo odvadi pisati sedaj, ko se se ucis, ker drugace te bo v prihodnosi kak sef pretepel. :)

Zgodovina sprememb…

  • spremenil: BigWhale ()

Spura ::

Predvsem kaze na to, da se ni ucil konceptov jezika, ampak recepte.

Anja91 ::

Iskreno bi prosila, če mi kdo pove samo še za tole nalogo, ker drugače nebom morala na izpit. Bi bila res zelo zelo zelo hvaležna..

Sestavi program, ki nariše eno kroglico naključne barve, ki se pojavi na naključnem mestu in giba v naključni smeri. Ko pride do roba, se odbije, tako kot ste se učili pri Fiziki. Odbija naj se približno dvajset sekund, nato se program konča

Anja

Spura ::

Zakaj hoces it na izpit necesa, pri cemer niti vaj ne znas resit? Samo eno polaganje izpita bos stran vrgla. :D

Anja91 ::

Za izpit bi se potrudila naučiti, imamo več rokov. Torej je kdo tako prijazen prosim?

zaj_tam ::

BigWhale je izjavil:


for x in range(1, 10):
neki = random.randint(1, 39)
if not neki in seznam:
seznam.append(neki)
else:
x -=1


V pythonu in v tem primeru morda ne ampak nekega dne, te bo taksna koda ubila. Raje se jo odvadi pisati sedaj, ko se se ucis, ker drugace te bo v prihodnosi kak sef pretepel. :)



Lahko malo razlozis zakaj? Sicer mi ni jasno kaj tocno ta koda dela ampak me zanima problematika. Se ucim :)

Anja91 ::

A mogoče delam v pravo smer?

import risar
krog = risar.krog(200, 200, 10)
for x in range(1000):
krog.setPos(x, x)
risar.cakaj(0.01)
risar.app.exec_()
«
1
2 3


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

python-rabim pomoč

Oddelek: Programiranje
162655 (885) rnla1973
»

Naloga iz Putka - UPM

Oddelek: Programiranje
242053 (1389) NejcSSD
»

urejanje - python

Oddelek: Programiranje
51276 (1053) ktka
»

Število decimalk???

Oddelek: Programiranje
71496 (1000) donkihod
»

Blackjack

Oddelek: Programiranje
61414 (1041) urosz

Več podobnih tem