Gå til innhold

[Løst] Problem med å sjekke array


Anbefalte innlegg

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 av TobbenTM
Lenke til kommentar
Videoannonse
Annonse

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

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

  • Liker 2
Lenke til kommentar

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
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 av SNIPPSAT
Lenke til kommentar

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

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

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

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 av zotbar1234
Lenke til kommentar

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 av zotbar1234
Lenke til kommentar

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 av Terrasque
Lenke til kommentar

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 av tomsi42
Lenke til kommentar

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 av zotbar1234
  • Liker 1
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...