TobbenTM Skrevet 7. august 2012 Del Skrevet 7. august 2012 (endret) Hei Lurte på om noen hadde noe lurt å si ang. dette; Her er kodesnutten som er problemet: def checkArray(array): high = 0.0 low = 100.0 for ms in array: if ms > high: high = ms if ms < low: low = ms Arrayet vil først se slik ut: ["0.0", "0.0", "0.0", "0.0"] Da vil funksjonen gi meg high = 0.0, low = 0,0. Etter noen sekunder vil arrayet f.eks se slik ut: ['48.7', '49.3', '48.9', '49.3'] Da gir funksjonen meg high = 49.3, low = 100.0. Det er da low som blir feil. Noen som vet hvorfor? Er det feil bruk av 'if'? Endret 7. august 2012 av TobbenTM Lenke til kommentar
laurell Skrevet 7. august 2012 Del Skrevet 7. august 2012 (endret) Usikker på hvordan det gjøres her, men i Java funker det med "else if" def checkArray(array): high = 0.0 low = 100.0 for ms in array: if ms > high: high = ms else if ms < low: low = ms Endret 7. august 2012 av laurell Lenke til kommentar
TobbenTM Skrevet 7. august 2012 Forfatter Del Skrevet 7. august 2012 Men da vil vel ikke low sjekkes hvis 'ms > high' er sann? Usikker på hvordan det gjøres her, men i Java funker det med "else if" Lenke til kommentar
laurell Skrevet 7. august 2012 Del Skrevet 7. august 2012 Om tallet som ligger som nr #4 i listen er høyere enn #2 så er den True ja, da trenger den ikke å sjekke "low". Det vil uansett føre til en unødvendig sjekk. Ikke helt sikker, men prøv også å sette variablene high og low til = 0.0 i starten. Lenke til kommentar
tomsi42 Skrevet 7. august 2012 Del Skrevet 7. august 2012 Dette er vel Python? Det er veldig enkelt - du har puttet tallene inn i enkelt og dobbeltfnutter - da regnes de som strenger, og da stemmer det at "100" er mindre enn "49". Dette er mitt kodeforslag: def checkArray(array): high = array[0] low = array[0] for ms in array[1:]: if ms > high: high = ms if ms < low: low = ms print "Low: ", low print "High:", high testData = [ 48.7, 49.3, 47.2, 49.3 ] checkArray(testData) Jeg setter også high og low til første verdi slik at vi er sikker på at high og low settes til en verdi som er i arrayet. Og da søker jeg i arrayet fra element nr. 2 2 Lenke til kommentar
TobbenTM Skrevet 7. august 2012 Forfatter Del Skrevet 7. august 2012 Dette er vel Python? Det er veldig enkelt - du har puttet tallene inn i enkelt og dobbeltfnutter - da regnes de som strenger, og da stemmer det at "100" er mindre enn "49". Dette er mitt kodeforslag: def checkArray(array): high = array[0] low = array[0] for ms in array[1:]: if ms > high: high = ms if ms < low: low = ms print "Low: ", low print "High:", high testData = [ 48.7, 49.3, 47.2, 49.3 ] checkArray(testData) Jeg setter også high og low til første verdi slik at vi er sikker på at high og low settes til en verdi som er i arrayet. Og da søker jeg i arrayet fra element nr. 2 Selvfølgelig! Takker så mye! Lenke til kommentar
snippsat Skrevet 7. august 2012 Del Skrevet 7. august 2012 (endret) Etter noen sekunder vil arrayet f.eks se slik ut: ['48.7', '49.3', '48.9', '49.3']Da gir funksjonen meg high = 49.3, low = 100.0. Viss du har en liste med string elementet,må disse gjøres om til float verdier. Som nevnt av tomsi42. Viss ikke fungere ikke operators < > fungere som tenkt da du sammenligner string objekter. >>> '49.3' < '100' False >>> 49.3 < 100 True Kan bruke bygd inn min() max() for dette. def check_lst(lst): return min(lst), max(lst) lst = ['48.7', '49.3', '48.9', '49.3'] #Convert to float lst = [float(i) for i in lst] low,high = check_lst(lst) print low,high #48.7 49.3 Legg merke til at jeg sier/bruker list,da dette er det men bruker istedenfor array i python. >>> lst = ['48.7', '49.3', '48.9', '49.3'] >>> type(lst) <type 'list'> Endret 7. august 2012 av SNIPPSAT Lenke til kommentar
zotbar1234 Skrevet 11. august 2012 Del Skrevet 11. august 2012 def checkArray(array): high = array[0] low = array[0] for ms in array[1:]: Selv hvis man skal unngå min/max (for trenings skyld?), er det ingen grunn til å allokere en ekstra kopi. I leketøyseksemplene har dette ingen betydning, men jeg har hjulpet en tidligere kollega med ytelsesproblemer knyttet til litt for raus bruk av keys(). Lenke til kommentar
tomsi42 Skrevet 11. august 2012 Del Skrevet 11. august 2012 Selv hvis man skal unngå min/max (for trenings skyld?), er det ingen grunn til å allokere en ekstra kopi. I leketøyseksemplene har dette ingen betydning, men jeg har hjulpet en tidligere kollega med ytelsesproblemer knyttet til litt for raus bruk av keys(). Njaaa. Jeg er ikke sikker på om jeg er enig i at det er riktig å bruke min/max i denne sammenhengen. Ut ifra eksempelet, så vil jeg se at det er det å finne en algoritme og forstå hvordan den virker som er poenget. Det å bruke biblioteker for å gjøre hverdagen lettere bør komme senere. Ytelsesforbedringer vil jeg priorere enda lavere da det er viktig å få rett resultat først; hvis det går da trått, så er det på tide å se på hva som må gjøres for å få opp farta, eller få ned minnebruket. Lenke til kommentar
zotbar1234 Skrevet 12. august 2012 Del Skrevet 12. august 2012 Ytelsesforbedringer vil jeg priorere enda lavere da det er viktig å få rett resultat først; Ditt forslag kan skrives om uten tap av klarhet og uten en unødvendig kopi. Selv om det er lett å ta kopier, betyr det ikke at man skal det ved alle anledninger. Lenke til kommentar
tomsi42 Skrevet 12. august 2012 Del Skrevet 12. august 2012 Ditt forslag kan skrives om uten tap av klarhet og uten en unødvendig kopi. Selv om det er lett å ta kopier, betyr det ikke at man skal det ved alle anledninger. Jeg skal ikke protestere på at greit å unngå kopiering. Hvordan ville du ha gjort det i dette tilfellet? Lenke til kommentar
zotbar1234 Skrevet 12. august 2012 Del Skrevet 12. august 2012 (endret) Jeg skal ikke protestere på at greit å unngå kopiering. Hvordan ville du ha gjort det i dette tilfellet? Med min/max, siden det er klarest. Om det ikke er tillatt (jfr øvingsoppgave): def checkArray(array): high, low = array[0], array[0] for element in array: high = max(high, element) low = min(low, element) return high, low # end checkArray Dvs. jeg bruker jo min/max fremdeles, men ikke for å søke gjennom hele listen Endret 12. august 2012 av zotbar1234 Lenke til kommentar
tomsi42 Skrevet 12. august 2012 Del Skrevet 12. august 2012 Nettopp. Du leser heller første elementet i arrayet flere ganger enn å kopiere arrayet. Tenkte du hadde funnet en lur måte å begynne fra element 1 uten å kopiere. Lenke til kommentar
zotbar1234 Skrevet 12. august 2012 Del Skrevet 12. august 2012 (endret) Nettopp. Du leser heller første elementet i arrayet flere ganger enn å kopiere arrayet. Jepp. Et soleklart bedre valg. Tenkte du hadde funnet en lur måte å begynne fra element 1 uten å kopiere. Ja, det kan man (xrange() eller eksplisitt iter() + next()), men hva skulle poenget med det være? Endret 12. august 2012 av zotbar1234 Lenke til kommentar
Terrasque Skrevet 13. august 2012 Del Skrevet 13. august 2012 (endret) For completeness.. Man kunne vel også lagd en custom generator? def myslicer(worklist, start=0, step = 1): try: while True: yield worklist[start] start += step except IndexError: return >>> a [1, 2, 3] >>> for x in myslicer(a, 1): ... print x ... 2 3 Endret 13. august 2012 av Terrasque Lenke til kommentar
tomsi42 Skrevet 13. august 2012 Del Skrevet 13. august 2012 (endret) Jepp. Et soleklart bedre valg. I dette tilfellet, så er det nok det. Men om det alltid er slik kan sikkert diskuteres. Da fortrinnsvis som en hyggelig og filosofisk diskusjon med noe godt i glasset. Ja, det kan man (xrange() eller eksplisitt iter() + next()), men hva skulle poenget med det være? Eneste poeng jeg kan se, er at man bruker oppgaven som et eksempel på alternative måtere å løse ett og samme problem på, eventuellt vise andre sider av python som programmeringsspråk. For completeness.. Man kunne vel også lagd en custom generator? Det er også en løsning, som viser hvodan man kan bruke yield. Ulempen er at det blir mindre lesbart enn det som er allerede er foreslått. Endret 13. august 2012 av tomsi42 Lenke til kommentar
zotbar1234 Skrevet 13. august 2012 Del Skrevet 13. august 2012 (endret) For completeness.. Man kunne vel også lagd en custom generator? Challenge accepted >>> itertools.islice(range(5), 1, None) <itertools.islice object at 0x7f881bb71e10> >>> list(_) [1, 2, 3, 4] Finner alltid noe lurt i itertools. Endret 13. august 2012 av zotbar1234 1 Lenke til kommentar
tomsi42 Skrevet 15. august 2012 Del Skrevet 15. august 2012 Imponerende python kunnskaper her Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå