Knasigt fel på en while loop i python. [LÖST]

Här diskuteras programmering och utveckling
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Knasigt fel på en while loop i python. [LÖST]

Inlägg 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
Senast redigerad av 1 ZerQ, redigerad totalt 24 gånger.
hagelnut
Inlägg: 299
Blev medlem: 18 okt 2007, 01:12
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS

Re: Knasigt fel på en while loop i python.

Inlägg 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] != '.' ]
hagelnut
Inlägg: 299
Blev medlem: 18 okt 2007, 01:12
OS: Ubuntu
Utgåva: 16.04 Xenial Xerus LTS

Re: Knasigt fel på en while loop i python.

Inlägg 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 = []
    
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Knasigt fel på en while loop i python.

Inlägg 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:

Kod: Markera allt

li = [ x for x in li if x[0] != '.' ]
Alternativt kan man använda den inbyggda funktionen filter:

Kod: Markera allt

li = filter(lambda x : x[0] != '.', li)
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Re: Knasigt fel på en while loop i python.

Inlägg 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
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Knasigt fel på en while loop i python.

Inlägg 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

Kod: Markera allt

for x in list:
    # do something with x
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.
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

Re: Knasigt fel på en while loop i python. [LÖST]

Inlägg 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.
Användarvisningsbild
ZerQ
Inlägg: 160
Blev medlem: 01 aug 2007, 08:40
OS: Annat GNU/Linux
Ort: Ornsköldsvik
Kontakt:

Re: Knasigt fel på en while loop i python. [LÖST]

Inlägg 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å:

Kod: Markera allt

f1 = [x for x in folderAll if x[0] != '.']
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?
David Andersson
Inlägg: 1269
Blev medlem: 15 dec 2007, 03:20
OS: Xubuntu

Re: Knasigt fel på en while loop i python. [LÖST]

Inlägg 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.
Skriv svar

Återgå till "Programmering och webbdesign"