Sida 1 av 1
Knasigt fel på en while loop i python. [LÖST]
Postat: 24 okt 2008, 19:14
av ZerQ
Jag håller på att lära mig hur man arbetar med filsystemet, just nu har jag ett litet program som skall läsa in innehållet i en mapp med os.listdir . Detta placerar jag i en lista så att jag kan skriva ut den.
Kruxet är ju att jag även får med alla dolda mapparna i home/mittnamn. Tänkte då att jag skriver en lite while slinga som kollar efter punkten i varje position i listan och om den hittar en sådan ta bort den ifrån listan. Problemet är att while slingan stannar efter 25 steg och sedan bara kliver ur loopen.
Jag hittar inte vad som är fel. Behöver lite hjälp
Kod: Markera allt
while i < len(li):
k.extend(li[i])
if k[0] == '.':
li.pop(i)
k = []
i += 1
Re: Knasigt fel på en while loop i python.
Postat: 24 okt 2008, 19:46
av hagelnut
Håller själv på att lära mig python. Kanske skulle du kunna använda "list comprehension" i stället:
Kod: Markera allt
li = [ li[x] for x in range( 0, len(li) ) if li[x][0] != '.' ]
Re: Knasigt fel på en while loop i python.
Postat: 24 okt 2008, 20:01
av hagelnut
Och problemet med din slinga kan väl vara att du ändrar längden på listan under körningen (samtidigt som du ökar i). Vill du använda while så kan du väl testa:
Kod: Markera allt
while i < len(li):
k.extend(li[i])
if k[0] == '.':
li.pop(i)
else:
i += 1
k = []
Re: Knasigt fel på en while loop i python.
Postat: 24 okt 2008, 20:14
av David Andersson
ZerQ skrev:
Jag hittar inte vad som är fel. Behöver lite hjälp
Kod: Markera allt
while i < len(li):
k.extend(li[i])
if k[0] == '.':
li.pop(i)
k = []
i += 1
(EDIT: hagelnut hann före
Felet: När du poppar bort en fil så kommer ju nästa fil att hamna i position "i", ändå så uppdaterar du "i". En fil direkt efter en fil med "." kommer inte att testas. Ungefär varannan "."-fil blir kvar.)
Inte fel,
men: Tanken är att "k" ska vara tom i början på varje loop-varv. Att nollställa den i slutet av loopen i stället för början känns så BASIC, även om det i det här fallet funkar.
Hagelnuts lösning är kortare och bättre, och kan göras ännu kortare:
Alternativt kan man använda den inbyggda funktionen
filter:
Re: Knasigt fel på en while loop i python.
Postat: 24 okt 2008, 20:18
av ZerQ
Japp naturligtvis, så klart! Tack så mycket för hjälpen nu när du skrev det så såg jag felet. Ibland är lösningen så nära men ändå så långt bort.

Jo dom lösningarna ser mycket bra ut men jag vill nöta slingor så mycket jag kan och inte gå för fort fram i att lära sig nya saker.
Kommer att komma fram till detta också vid ett senare tillfälle, men tack för dom snygga lösningarna ni har skickat
Ni får gärna förklara hur det fungerar så att man förstår, är alltid nyfiken. framför allt lambda funktionen
Re: Knasigt fel på en while loop i python.
Postat: 26 okt 2008, 00:35
av David Andersson
ZerQ skrev: jag vill nöta slingor så mycket jag kan och inte gå för fort fram i att lära sig nya saker.
Om du ska nöta slingor är det bra att vänja sig vid att inte använda array-index som loop-variabel (om det inte behövs). Iterera direkt över objekten i listan.
I stället för
Kod: Markera allt
i=0
while i<len(list):
# do something with list(i)
i += 1
eller
Kod: Markera allt
for i in range(0, len(list)):
# do something with list(i)
kan du göra
List kan då vara en lista, en tupel, en generator (eller heter det iterator?) eller en mappning (då x loopar genom alla nycklar).
ZerQ skrev:Ni får gärna förklara hur det fungerar så att man förstår, är alltid nyfiken. framför allt lambda funktionen
Säg till när du är klar med loopar så ska vi förklara lambda.
Re: Knasigt fel på en while loop i python. [LÖST]
Postat: 26 okt 2008, 01:17
av Smygis
lambda är ganska lätt att förstå. Det är ett finurlig litet nyckelord man kan använda för att skapa namnlösa funktioner.
Tex som följande.
Kod: Markera allt
>>> f = lambda x: x*2 + x**3 - 4
>>> f(1)
-1
>>> f(2)
8
>>> f(3)
29
>>>
Så att skriva:
Kod: Markera allt
>>> filter(lambda x: x%2, range(10))
[1, 3, 5, 7, 9]
Är samma sak som att skriva:
Kod: Markera allt
>>> def func(x):
... return x % 2
...
>>> filter(func, range(10))
[1, 3, 5, 7, 9]
Väldigt användbart för små korta beräkningar eller helt enkelt filter.
Re: Knasigt fel på en while loop i python. [LÖST]
Postat: 26 okt 2008, 09:31
av ZerQ
Tror at jag har lite koll på en del saker nu iaf, korrigera mig om jag har fel. Har gjort följande i mitt lilla program nu. Skapat en lista som jag fyllt med innehållet ifrån mappen jag är intresserad av, sedan skickar jag den till filtreringen. Koden ser ut som detta då:
Om jag har förstått detta rätt så stegar vi genom folderAll listan genom att skriva x for x in folderAll. Detta skall göras så länge som listan inte har nått slutet. if x[o] != '.' detta gör att allt som inte har punkten i index 0 skall sparas i den nya listan f1.
Har dock ett par funderingar, varför måste jag ha []?, jag antar att det är för att vi arbetar med en listfunktion! Sedan brukar man ju behöva , mellan 2 saker som skall utföras! varför inte här?
Re: Knasigt fel på en while loop i python. [LÖST]
Postat: 27 okt 2008, 01:41
av David Andersson
ZerQ skrev:Har dock ett par funderingar, varför måste jag ha []?, jag antar att det är för att vi arbetar med en listfunktion! Sedan brukar man ju behöva , mellan 2 saker som skall utföras! varför inte här?
När jag lusläser pythondokumentationen tolkar jag det som att "for" (och valbart "if") är nyckelord som gör att den känner igen uttrycket mellan [ och ] som en
list comprehension. Syntax, helt enkelt.
[ resultatuttryck
for variabel
in mängduttryck
if urvalsuttryck
]
variabel användas normalt i
resultatuttryck för att få olika värden i olika positioner i resultatlistan.
Om jag har förstått detta rätt så stegar vi genom folderAll listan genom att skriva x for x in folderAll.
Så har jag också fattat. Fast det är "for x in folderAll" som stegar igenom listan. Det första "x" är det värde du vill ha i resultatlistan i varje position.