9 svar
368 visningar
lund är nöjd med hjälpen
lund 529
Postad: 13 nov 2020 12:53 Redigerad: 13 nov 2020 13:54

Ta bort alla nollor i slutet av ett polynom

Hej,

Jag ska skriva en funktion drop_zeroes i Python som tar bort alla nollor i slutet av ett polynom. Exempelvis ska p0=[2,0,1,0] via kommandot drop_zeroes(p0) skrivas som [2,0,1] och q0=[0,0,0] skrivas som [] i samma kommande för q0.

Jag har kodat enligt nedan:


p=[2,0,1,0]p=[2,0,1,0]
q=[0,0,0]q=[0,0,0]

def drop_zeroes(p_list):
      while p_list[-1] == 0:
                return items.pop()

drop_zeroes(p0)
drop_zeroes(q0)
print(p0)
print(q0)

Och detta fungerar för p0 men inte för q0 - hur kan jag ordna att det gäller för en lista men endast nollor? Och sen vill jag även kunna ta bort de fyra sista raderna (de kursiverade) och endast behöva skriva drop_zeroes() i Console-rutan i Python för att kunna få fram den förkortade listan, men i dagsläget fungerar det endast om de står med i själva kodningen. Tack på förhand!

För att förtydliga: Nedan är ett exempel där ni kan se att drop_zeroes(p0) inte ger mig något resultat när jag skriver den i Console-rutan (rad 170) men när jag har med den i kodningen (rad 171) så kommer korrekt svar ut för p0 men endast en nolla försvinner för q0 när den egentligen ska bli en tom lista då alla nollor ska försvinna:

Tegelhus 225
Postad: 13 nov 2020 14:14

Problemet med funktionen är att return även avbryter funktionen. Din loop kommer alltså aldrig att få gå klart, eftersom om en nolla hittas så avbryts algoritmen i förtid. Det problemet hade man kunnat lösa genom att placera return efter while-loopen, likt

def drop_zeroes(p_list):
	while p_list[-1] == 0:
		p_list.pop()
	return p_list

Då kommer loopen att få gå klart (tills den inte längre hittar en nolla i slutet), och först därefter returneras listan.

Notera dock att koden ovan inte är komplett - det finns fortfarande ett problem att åtgärda. Vad händer när listan är tom?

lund 529
Postad: 13 nov 2020 15:04 Redigerad: 13 nov 2020 15:14

Tack Tegelhus, med denna lösning kunde jag även skriva kommandot i console-rutan!

När listan är tom, exempelvis för q0=[0,0,0], så får jag [0,0] och för att korrigera detta antar jag att jag behöver lägga till ett villkor i while-loopen för vad som ska ske när listan är tom? Kan det stämma?

Jag testade att tillägga det kursiverade :

def drop_zeroes(p_list):
while p_list[0] == 0:
return "0"
if p_list[-1] == 0:
p_list.pop()
return p_list

och det verkar fungera. Har jag uttryckt det korrekt? Edit: Denna fungerade inte om jag hade mer än en nolla i slutet, exempelvis för [2,0,1,0,0].

Tegelhus 225
Postad: 13 nov 2020 15:12
lund skrev:

Tack Tegelhus, med denna lösning kunde jag även skriva kommandot i console-rutan!

När listan är tom, exempelvis för q0=[0,0,0], så får jag [0,0] och för att korrigera detta antar jag att jag behöver lägga till ett villkor i while-loopen för vad som ska ske när listan är tom? Kan det stämma?

Jag testade att tillägga det kursiverade :

def drop_zeroes(p_list):
while p_list[0] == 0:
return "0"
if p_list[-1] == 0:
p_list.pop()
return p_list

och det verkar fungera. Har jag uttryckt det korrekt? 

Det är svårt att se vad som hör till vad i och med att indenteringen försvunnit. Tips: Tryck på knappen {;} för att lägga in din kod, så behåller den formateringen.

lund 529
Postad: 13 nov 2020 15:18 Redigerad: 13 nov 2020 15:40

Ber om ursäkt, här kommer den med indenteringen i behåll:

p0 = [2, 0, 1, 0, 0]
q0 = [0, 0, 0]

def drop_zeroes(p_list):
       while p_list[0] == 0:
                p_list.pop()
       return p_list

Men testade detta för en ny lista r0=[1,0,0,0] och då fungerade den inte, där försvann endast en nolla och inte samtliga (gissar pga att jag satt p_list[0]). Så uppskattar all hjälp för att kunna få fram på vilket sätt jag ska definiera den tomma listan!

Jroth 1191 – Fd. Medlem
Postad: 13 nov 2020 16:03
>>> p0=[2,0,1,0,0]
>>> list(filter(lambda element: element != 0, p0))
[2, 1]
lund 529
Postad: 13 nov 2020 16:07
Jroth skrev:
>>> p0=[2,0,1,0,0]
>>> list(filter(lambda element: element != 0, p0))
[2, 1]

Tack denna hade man kunnat använda, men vill även ha kvar nollan i mitten så att det slutgiltiga svaret blir [2,0,1]. Det är alltså bara nollor som ska bort om de är skrivna sist i listan. Men ska spara denna kod också då jag säkerligen har nytta av den i framtiden!

Jroth 1191 – Fd. Medlem
Postad: 13 nov 2020 16:25
>>> from itertools import dropwhile
>>> p0=[2,0,1,0,0]
>>> list(reversed(tuple(dropwhile(lambda element: element==0,reversed(p0)))))
Jroth 1191 – Fd. Medlem
Postad: 13 nov 2020 16:36

Om du envisas med att krångla till det kan du göra så här

>>> def dropz(plist):
    while plist and plist[-1]==0:
        plist.pop()
    return plist

Vilket ger


>>> dropz(p0)
[2, 0, 1]
>>> dropz(q0)
[]
lund 529
Postad: 13 nov 2020 16:40

Tack Jroth för de båda svaren, de fungerade båda två utmärkt! Får jag fråga hur du gick tillväga för att skriva den första kodningen? Det vill säga vad använder du dig av där om inte en loop? Är väldigt ny på Python så försöker fortfarande lära mig och den verkade smidigare än det jag höll på med.

Svara Avbryt
Close