Permalänk
Medlem

Loop i python

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] for j in k: if j > 81: k.remove(j) print(k)

När jag kör detta så får jag k = [1, 2, 3, 56, 34, 1234, 2, 3, 4, 5, 6, 1]

Varför tar inte python bort 1234? men allt annat som är över 81 :S

Permalänk
Medlem
Skrivet av xonke:

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] for j in k: if j > 81: k.remove(j) print(k)

När jag kör detta så får jag k = [1, 2, 3, 56, 34, 1234, 2, 3, 4, 5, 6, 1]

Varför tar inte python bort 1234? men allt annat som är över 81 :S

Åh kom igen, den är för enkel

konstruktivt svar: testa att skapa en tom lista, där du istället för att ta bort alla tal över 81, lägger till alla tal under 82. Dvs

for j in k: if j < 82: l.add(j) print(l)

Blir det rätt? Om ja, varför blir det första exemplet fel?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av xonke:

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] for j in k: if j > 81: k.remove(j) print(k)

När jag kör detta så får jag k = [1, 2, 3, 56, 34, 1234, 2, 3, 4, 5, 6, 1]

Varför tar inte python bort 1234? men allt annat som är över 81 :S

Som personen före mig är inne på (antar jag). Anledningen till att det inte funkar är för att du tar bort element från samma lista som du loopar på, ett fel som man kan bli tokig på innan man kommer på varför När du plockat bort 543 så hoppar den till nästa index som då pekar på 2 och 1234 blir aldrig testad. En smidig workaround är:

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] for j in list(k): if j > 81: k.remove(j) print(k)

Då loopar du på en nya kopia till listan, men det är inte så optimalt som att bygga något som själv håller reda på indexet vid borttagningen

Visa signatur

*** Signaturen raderad på grund av för många rader. Läs forumreglerna. /xphaze

Permalänk
Medlem

Haha förstog att det var nåt simpelt...

Skyller på att jag är trött och oerfaren kodknackare, tack för hjälpen !

Permalänk
Medlem
Skrivet av matte_amal:

Som personen före mig är inne på (antar jag). Anledningen till att det inte funkar är för att du tar bort element från samma lista som du loopar på, ett fel som man kan bli tokig på innan man kommer på varför När du plockat bort 543 så hoppar den till nästa index som då pekar på 2 och 1234 blir aldrig testad. En smidig workaround är:

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] for j in list(k): if j > 81: k.remove(j) print(k)

Då loopar du på en nya kopia till listan, men det är inte så optimalt som att bygga något som själv håller reda på indexet vid borttagningen

Hmm, visst är det även möjligt att göra detta med två listor?

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] l = [] for j in list(k): if j < 81: l.add(j) print(l)

Tycker åtminstone jag är ett lite simplare sätt, men det kanske har andra nackdelar?

EDIT: Haha, nu när jag läste nogrannare såg jag att det var precis detta du gjort. NVM

Visa signatur

CPU: AMD Ryzen 5 3600 XT | RAM: 16GB 3200MHz | MB: Asus Prime B350-Plus | GPU: Sapphire Radeon RX 5600 XT Pulse | PSU: EVGA 650 GQ | Chassi: Fractal Design Define C | SSD: Intel 600p 512 GB

Permalänk
Skrivet av JonteP0nte:

Hmm, visst är det även möjligt att göra detta med två listor?

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] l = [] for j in list(k): if j < 81: l.add(j) print(l)

Tycker åtminstone jag är ett lite simplare sätt, men det kanske har andra nackdelar?

Fast i så fall kan du köra på Teknocide's sätt med "for j in k:" för du behöver ingen kopia i det fallet vad jag kan se.
Sen brukar det vara väldigt personligt vad man tycker känns naturligast. Finns även andra kriterier som hur mycket data man jobbar med osv... Finns säkert tusen sätt att lösa det på

Här är ett som känns mer optimalt, men jag är ingen python-expert och man bör testa om man är ute efter prestanda:

k = [1, 12343, 2, 3, 56, 123, 34, 543, 1234, 2, 3, 4, 5, 6, 1, 1231352] i = 0 count = len(k) while(i < count): if k[i] > 81: del k[i] count -= 1 else: i += 1 print(k)

Visa signatur

*** Signaturen raderad på grund av för många rader. Läs forumreglerna. /xphaze

Permalänk
Medlem

Kan bara kort hänvisa till följande fråga på SO:
http://stackoverflow.com/questions/1207406/remove-items-from-...

Visa signatur

weeeee