Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!
Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Maj 2018

python bubblesort

Följande uppgift är från en programmeringskurs på Uppsala universitet:

Skriv en funktion bytintill(li) som går igenom en lista li . Om två intilliggande tal, li[k] och li[k+1] ligger i minskande ordning, dvs li[k] > li[k+1], ska dessa två tal byta plats. Detta ska göras för alla k i tur och ordning. Testa funktionen noga och motivera att du har testat tillräckliga fall. Skriv en funktion bubblesort() som anropar bytintill() upprepade gånger tills inga mer byten sker. OBS: att bytintill() byter plats på två tal är en sidoeffekt eftersom listan förändras. Listan behöver alltså inte skickas som returvärde. Däremot måste ju bubblesort() på något sätt få reda på om byte skett. Ett sätt är att från bytintill() returnera ett sanningsvärde som anger detta. Testa funktionen med en testfunktion!

Jag har försökt att skriva en funktion bytintill med en for-loop som endast byter plats på två element åt gången. Det boolska-värdet är False initiellt och ändras till True om byten sker.

Därefter har jag gjort en funktion bubblesort som anropar bytintill så länge byten sker:

def task3_bytintill(the_list): swap = False for i in range(len(the_list)-1): if the_list[i] > the_list[i+1]: temp = the_list[i] the_list[i] = the_list[i+1] the_list[i+1] = temp swap = True return swap break def task3_bubblesort(): while test_task3 == True: return(test_task3, "the list is being sorted...") else: return(test_task3, "the list is sorted") test_task3 = task3_bytintill([1,5,3,2]) print( task3_bubblesort())

Jag har försökt att göra det här med en generell lösning där man tilldelar en variabel, test, funktionen som returnerar något och sedan printar det. När jag väl kör koden så får jag resultatet: (True, 'the list is being sorted...')

Vad behöver jag göra för att anropa bytintill med bubblesort så många gånger det behövs och sedan returnera den initiala listan, strängen "the list is being sorted...." och listan efter bytet. Efter det sista bytet bör det returnera "the list is sorted", [listan].

T.ex. en korrekt exekvering:

([1,9,7,5], 'the list is being sorted...', [1,7,9,5])
([1,7,9,5], 'the list is being sorted...', [1,7,5,9])
([1,7,5,9], 'the list is being sorted...', [1,5,7,9])
('the list is sorted: ', [1,5,7,9]

Det jag har problem med är att nå lokala variabler i funktioner. Jag skulle bli tacksam om någon kunde visa hur.

| Ryzen 2700 | Corsair LPX 32GB | Prime B450-Plus | GTX 970 | 970 Evo | Kolink Observatory | RM750x |

| JDS Labs Atom | Khadas Tone Board | Fostex TX-X00 & HIFIMAN HE4XX |

| Fiio E10K | Beyerdynamic DT770 |

Trädvy Permalänk
Moderator
Registrerad
Aug 2007

Du måste ha anropet till din funktion inom din (while)loop.
Jag hade nog inte heller använt while, en do ... while känns bättre. Anledningen till det är att du vill att loopen ska köra minst en gång.

Använd gilla för att markera nyttiga inlägg!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Okt 2001

Skriv enhetstester för de problem du vill lösa och fixa ett problem i taget.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2011

Jag tar mig friheten att kommentera lite i koden

Skrivet av futhark14:

def task3_bytintill(the_list): swap = False for i in range(len(the_list)-1): <-- Spana in idx, item in enumerate(the_list) if the_list[i] > the_list[i+1]: temp = the_list[i] the_list[i] = the_list[i+1] the_list[i+1] = temp swap = True return swap <-- Du returnerar bara på ett ställe, och det kommer alltid vara True, right? break <-- Behöver inte ha en break efter return --> Kika lite på den här funktionen. Hur while fungerar, hur man anropar funktioner, osv. def task3_bubblesort(): while test_task3 == True: return(test_task3, "the list is being sorted...") else: return(test_task3, "the list is sorted") test_task3 = task3_bytintill([1,5,3,2]) print( task3_bubblesort())

:(){ :|:& };:

{🧗‍♂️, 🔥, 🏃‍♂️, ☕}

Blog
YouTube

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Nov 2011
Skrivet av Flexbert:

Skriv enhetstester för de problem du vill lösa och fixa ett problem i taget.

Tror du man har koll på enhetstestning när man läser en programmeringskurs där uppgifterna är på denna nivå?

:(){ :|:& };:

{🧗‍♂️, 🔥, 🏃‍♂️, ☕}

Blog
YouTube

Trädvy Permalänk
Medlem
Plats
Södra norrland
Registrerad
Jul 2003

Var ett litet tag sen jag använde python men går det inte att slippa temp variabeln eftersom python klarar av att byta plats på variabler enligt metoden nedan:

a, b = b, a

Stationär: R9 3900X | 32GB@3200MHz | RTX 3080 10GB | Seasonic Prime Platinum 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Trädvy Permalänk
Medlem
Plats
PITEÅ
Registrerad
Apr 2018
Skrivet av GLaDER:

Tror du man har koll på enhetstestning när man läser en programmeringskurs där uppgifterna är på denna nivå?

Tycker att kvalitetssäkring är viktigt och lär ut detta i mina kurser på gymnasiet. Förmodar att enhetstestning med hjälp av unittest, nose2 eller pytest lärs ut även på universitetsnivå.

Men om det inte är på det viset så kan man använda assert istället. Det är enkelt att komma igång med och "good enough" för små kodsnuttar. Exempel:

if __name__ == '__main__': a_list = [1, 5, 3, 2] bubblesort(a_list) assert a_list == [1, 2, 3, 5]

// Lars Lindehaven

Trädvy Permalänk
Medlem
Registrerad
Okt 2016
Skrivet av GLaDER:

Tror du man har koll på enhetstestning när man läser en programmeringskurs där uppgifterna är på denna nivå?

Man behöver inte något ramverk för enhetstestning, hell det är inte ens en enhet utan 1 funktion.
Bara skriva en loop över datamängder och sedan kolla om dom är sorterade eller inte.

Stax 353xbk | Stax L300Le + L700 Arc + Custom Pads
SMSL AD18 | Kef Q300