Meddelande
På gamla.pluggakuten.se kan du fortfarande läsa frågorna och svaren som ställts, men du kan inte skapa ett nytt konto eller nya trådar. Nya frågor och nytt konto skapar du på det nya forumet, välkommen dit!
En kod med Python
- wow_08
- Medlem
Offline
- Registrerad: 2016-02-16
- Inlägg: 52
En kod med Python
Hej!
Kan någon hjälpa mig med följande kod som finns att hitta i en gammal tenta? Den är svår
Skriv en funktion deleteShort, som tar en lista som argument samt ett heltal. Funktionen uppdaterar listan så att varje element, som också är en lista, kortare än eller lika med heltalet raderas. Man får inte använda inbyggda funktioner eller metoder för strängoperationer. Dock går det att använda len och range, samt in.
Alltså:
>> ls=[[1],[],[2,3],[],[4,5,6],[]]
>> deleteShort(ls,1)
>> ls
[[2,3],[2,5,6]]
Tack på förhand!
- xam
- Medlem
Offline
- Registrerad: 2016-10-03
- Inlägg: 44
Re: En kod med Python
Kod:
ls=[[1],[],[2,3],[],[4,5,6],[]] def deleteShort(ls, heltal): new = [] for echList in ls: if echList <= [heltal]: pass else: new.append(echList) print new deleteShort(ls,1) #Startar funktionen
Svår uppgift. Snällt av dem som hopfogade tentan att också inkludera "in" funktionen som ett alternativ. Menar; blev ju säkert en stor hjälp för gossarna som skrev provet.
Jag postar i alla fall en "lösning" med en for-loop och annat (kanske hjälper dig på traven..vem vet).
Senast redigerat av xam (2016-12-01 12:42)
- annlu
- Medlem
Offline
- Registrerad: 2016-11-02
- Inlägg: 58
Re: En kod med Python
Om jag förstått uppgiften rätt så ska funktionen deleteShort() modifiera ls direkt. Jag tolkar det så eftersom wow_08 har skrivit följande:
wow_08 skrev:
>> ls=[[1],[],[2,3],[],[4,5,6],[]]
>> deleteShort(ls,1)
>> ls
[[2,3],[2,5,6]]
Vi passerar alltså listan ls och ett heltal num till deleteShort. Funktionen gör sedan sitt jobb med att ta bort de korta listelementen. Eftersom ingen ny lista returneras men ls ändå har ändrats efter funktionsanropet måste det betyda att deleteShort() modifierar ls direkt (vilket fungerar eftersom listor är mutable objekt).
I xams lösning förblir ls oförändrad efter funktionsanropet eftersom det rätta resultatet sparas i den nya listan new inne i funktionens scope.
Här är mitt förslag på en lösning:
Kod:
def deleteShort(ls, num): # Sparar de index där ls har kortare eller lika stora listelement som num index_to_delete = [] for i in range(len(ls)): if len(ls[i]) <= num: index_to_delete.append(i) # Reverse så vi kan ta bort elementen bakifrån index_to_delete = index_to_delete[::-1] for i in index_to_delete: del ls[i] >> ls = [[1], [], [2, 3], [], [4, 5, 6], []] >> deleteShort(ls, 1) >> ls [[2,3],[2,5,6]]
Det jag tycker är svårt är att inte få använda inbyggda funktioner. Om list.append() är otillåtet kan man byta den raden till
Kod:
index_to_delete += [i]
Men om del är otillåtet vet jag inte hur man ska ta bort element ur ls. Alla typer av modifieringar av ls (som list comprehension, slicing) skapar en ny lista som alltså inte påverkar ls i det yttre scopet. Någon som har en lösning på det? Eller har jag tolkat uppgiften för strikt?
- wow_08
- Medlem
Offline
- Registrerad: 2016-02-16
- Inlägg: 52
Re: En kod med Python
Tack så mycket till er båda! Hjälpte jättemycket!