Permalänk
Medlem

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.

Visa signatur

| Ryzen 3800XT | Corsair LPX 32GB | B550 Aorus Elite v2 | GTX 970 | Samsung 970 Evo | CM Masterbox 520 | RM750x | Windows 7

| Ryzen 2700 | Corsair LPX 16GB | Prime B450-Plus | GT 1030 | Samsung 970 Evo | Kolink Observatory | RM750x | EndeavourOS

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

Permalänk
Hedersmedlem

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.

Visa signatur

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

Permalänk
Medlem

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

Permalänk
Medlem

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())

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem
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å?

Visa signatur

:(){ :|:& };:

🏊🏻‍♂️   🚴🏻‍♂️   🏃🏻‍♂️   ☕

Permalänk
Medlem

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

Visa signatur

Primär: R9 3900X | ASUS X570-F Gaming | NH-D15 | 64GB@3200MHz | RTX 3080 10GB | Seasonic 850W | Fractal Define R6 |
Gamla bettan: i5 750@3.8GHz | 8GB | HD5770 | Corsair VS 550W | FD R2 |

Permalänk
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]

Visa signatur

// Lars Lindehaven

Permalänk
Medlem
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.