Göm meny
Gäller för: VT26

Pythonuppgifter, kapitel 2. Sekvenser

Att lära dig från uppgifterna

  • Förstå vad en sekvens är med särskilt fokus på listor, tupler och strängar.
  • Förstå access av element i sekvenser med indexering.
  • Förstå hur slice fungerar.

Man kan få max 57 poäng och för att få godkänt krävs 28 poäng. Försök dock att lösa alla uppgifter då inte alla fel upptäcks av rättningsskriptet. Om ni har lite marginal kan ni kanske bli godkända även om assistenten som rättar hittar något sådant fel.

Uppgift 2.1

Subskriptnotationen för index

Sekvenser i Python har per definition en ordning och vi kan komma åt element på olika platser med hjälp av index och subskriptnotation. Vi kommer titta särskilt på strängar, listor och tupler i de här uppgifterna men andra sekvenstyper kan dyka upp längre fram i kursen.

För att testa uppgifterna nedan kan du använda strängen "abcdef", listan [1, 2, 3, 4, 5] och tupeln (1, 2, 3, 4, 5).

Strängar är som vi sett ett sätt att representera text i Python (och andra programmeringsspråk) medan tupler och listor är så kallde behållare (eng. containers) eller samlingar (eng. collections), dvs en typ av värden som “innehåller” och “samlar” andra värden. Vi kommer stöta på flera samlingar längre fram i kursen.

Det är viktigt att veta att en lista, eller en tupel, kan innehålla vilka datatyper som helst, även blandat, som i [1, "b", 3.0]. Vi kommer till vad som skiljer en lista från en tupel längre fram i kursen. För vad vi gör i det här avsnittet är det ingen skillnad mellan dem, annat än att listor skrivs med hakparenteser, [ och ], medan tupler skrivs med vanliga parenteser ( och ) (eller inga parenteser alls, vilket går bra ibland).

Överkurs: Ska man vara riktigt strikt är många kommaseparerade sekvenser av värden i Python-kod tupler. T.ex. argumenten till en funktion. Detta kan man utnyttja på olika intressanta sätt som vi kommer tillbaka till längre fram i kursen.

2.1.1 (5p)

Skriv en funktion second_element(seq) som tar in en sekvens som argument och returnerar det andra elementet i sekvensen.

2.1.2 (5p)

Skriv en funktion last_element(seq) som tar in en sekvens som argument och returnerar det sista elementet i sekvensen.

2.1.3 (2p)

Skriv en funktion second_last_element(seq) som tar in en sekvens som argument och returnerar det näst sista elementet i sekvensen.

2.1.4 (2p)

Skriv en funktion nth_element(seq, n) som tar in en sekvens och ett heltal som argument och returnerar elementet på index n i sekvensen

Uppgift 2.2

Subskriptnotationen för slice

Ofta är man intresserad av mer än att bara plocka ut ett enskilt värde i en sekvens. Istället vill man plocka ut delar av sekvensen, delsekvenser. I Python kan vi komma åt sådana slice (skivor, utsnitt, subsekvens, tyvärr finns ingen generellt accepterad svensk term) med hjälp av subskriptnotationen som vi tidigare använde för index. Använd slice för att lösa nedanstående uppgifter. Se Common Sequence Operations.

Använd samma testsekvenser som i den föregående uppgiften för att testa dina lösningar.

2.2.1 (5p)

Skriv en funktion three_first_in_sequence(seq) som tar in en sekvens som argument och returnerar delsekvensen med de tre första elementen i sekvensen.

2.2.2 (2p)

Skriv en funktion three_last_in_sequence(seq) som tar in en sekvens som argument och returnerar de tre sista elementeten i sekvensen.

2.2.3 (2p)

Skriv en funktion but_five_last_in_sequence(seq) som tar in en sekvens som argument och returnerar allting förutom de 5 sista elementen i sekvensen.

2.2.4 (5p)

Skriv en funktion every_other_in_sequence(seq) som tar in en sekvens som argument och returnerar vartannat element i sekvensen (det vill säga elementen på index 0, 2, 4, 6, …).

Tips: Du kommer behöva ett slice med två kolon.

2.2.5 (5p)

Skriv en funktion five_around_n_in_sequence(seq, n) som tar in en sekvens och ett heltal som argument och returnerar den delsekvens som innehåller de två elementen före index n, följt av elementet på index n och sist de två elementen efter index n. Anropet five_around_n_in_sequence("abcdefg", 3) ska alltså returnera "bcdef".

2.2.6 (2p)

Skriv en funktion reverse_sequence(seq) som tar in en sekvens som argument och returnerar sekvensen i omvänd ordning. Använd slice-notation.

Uppgift 2.3 (5p)

Skriv en funktion get_n_from_pos(seq, start, n) som tar en sekvens (seq) och två heltal (start och n) som argument. Funktionen ska returnera en sekvens som innehåller n element från och med index start ur sekvensen.

Exempel

>>> get_n_from_pos("Ett ytterligare exempel", 4, 11)
'ytterligare'
>>> get_n_from_pos("Ett ytterligare exempel", 4, 7)
'ytterli'
>>> get_n_from_pos("Ett ytterligare exempel", 8, 11)
'rligare exe'

Uppgift 2.4 (2p)

Skriv en funktion concatenate_sequences(seq1, seq2) som tar två sekvenser som argument och returnerar en ny sekvens som är en samanslagning av seq1 och seq2. Det vill säga först alla element i sekvens 1 följt av alla element i sekvens 2. Att sammanfga sekvenser på detta sätt kallas för att konkatenera (eng. concatenate).

Exempel

I exemplet använder vi tupler men prova med strängar och listor också. Vad händer om man försöker konkatenera två sekvenser av olika datatyp, t.ex. en lista och en sträng?

1
2
3
4
5
6
7
8
>>> tup1 = (1, 2, 3)
>>> tup2 = (4, 5, 6)
>>> concatenate_sequences(tup1, tup2)
(1, 2, 3, 4, 5, 6)
>>> print(tup1)
(1, 2, 3)
>>> print(tup2)
(4, 5, 6)

Uppgift 2.5 (5p)

Skriv en funktion list_append(seq, val) som tar in en lista och ett värde och returnerar en ny lista som innehåller samma element som seq men där val lagts till i slutet.

Den ursprunliga listan får inte modifieras (för dig som kanske programmerat i Python tidigare så innebär det t.ex. att den inbyggda listmetoden append alltså inte får användas). Vi kommer till att modifiera listor längre fram i kursen.

Exempel

>>> values = [1, 2, 3]
>>> list_append(values, "hej")
[1, 2, 3, 'hej']
>>> print(values)
[1, 2, 3]

Tips: Använd operatorn +.

Vad händer om seq är en sträng? Även om sekvenser har mycket gemensamt, så finns det situationer där olika sekvenstyper inte kan hanteras på exakt samma sätt.

Uppgift 2.6 (5p)

Python har en modul som innehåller färdiga funktioner som man kan använda när man vill ha med slumpen på något sätt i sin kod.

Importera modulen random. Skriv funktionen select_random(values) som väljer ut ett slumpmässigt värde bland de som finns i sekvensen values och returnera det. Använd funktionen random.choice().

Testa med alla tre sekvenstyper som vi introducerat.

Uppgift 2.7 (5p)

I denna uppgift ska du skriva en funktion som returnerar slumpmässigt valda pokemon-namn. Vi ska skicka in två tupler till den

  • en tupel med förled som "Bulba", "Pika" och "Ivy", dvs strängar som börjar med en versal och slutar med en vokal.
  • en tupel med efterled som "mon", "chu", och "saur", dvs strängar som börjar med en gemen konsonant.

Skriv funktionen generate_pokemon_name(prefixes, suffixes) som tar in dessa två sekvenser som argument. Slumpa fram ett värde från vardera tupel. Konkatenera sedan dessa två värden och returnera resultatet.

Använda rättningsskriptet

OBS! Rättningsskriptet kan bara användas från LiUs Linux-miljö, dvs. är inloggad på en Linux-dator i ett PUL på Campus, har anslutit via VSCodes RemoteSSH, är inloggad på en dator i ett PUL via RDP, eller är inloggad via ThinLinc.

Du kan bara köra rättningsskriptet för ett specifikt kapitel (t.ex. Pythonuppgifter, kapitel 2) en gång var åttonde minut. Detta är för att ni även behöver lära er hur ni testar er egen kod; ni ska inte vara beroende av att det finns ett rättningskript som hjälper er.

Innan du kör rättningsskriptet

Kommentera ut egna testanrop i din kodfil innan du kör rättningsskriptet. Rättningsskriptet kommer att köra din kodfil och om det finns testanrop i filen kan det störa rättningen. Du kan kommentera ut rader i Python genom att ställa dig på raden och trycka Ctrl+’ (tangenten ’ är oftast till höger om Ä på ett svenskt tangentbord) i VS Code. Du kan också markera flera rader och trycka samma tangentkombination för att kommentera ut alla markerade rader.

Köra rättningsskriptet

För att rätta din fil skriver du nedanstående ($ skrivs inte utan representerar prompten i terminalen):

1
$ /courses/TDDE44/kursmaterial/pyuppg/pytest.sh <kapitel> <kodfil>
  • Ersätt <kapitel> med det kapitel vars uppgifter koden löser, t.ex. 1 för att rätta kapitel 1, 2 för kapitel 2, osv.
  • Ersätt <kodfil> med namnet på filen som innehåller din kod.
  • OBS! Du måste stå i samma katalog som filen som du vill rätta.
  • OBS! Du får inte döpa din kodfil till ett namn med en punkt i filnamnet utöver punkten innan ändelsen py. Alltså, pyuppg1.py fungerar, pyuppg_kap.1.py fungerar inte.

Exempel

Exempel för Pythonuppgifter kapitel 2 om filen med dina lösningar är döpt till pythonuppg_2.py

1
$ /courses/TDDE44/kursmaterial/pyuppg/pytest.sh 2 pythonuppg_2.py

Exempel för Pythonuppgifter kapitel 3 om filen med dina lösningar är döpt till pyuppg3.py

1
$ /courses/TDDE44/kursmaterial/pyuppg/pytest.sh 3 pyuppg3.py

Resultat från rättningsskriptet

Rättningsskriptet kommer berätta för dig vilka uppgifter som är godkända, vilka som inte är godkända och vilka som inte hittades. Rättningsskriptet berättar också hur många poäng du fått totalt på hela kapitlet.

När du kör rättningsskriptet kommer du få en utskrift i terminalen som liknar den nedan.

Rättningsskriptet ger ofta viss feedback om vad som är fel. Ni kommer dock ofta själva att behöva felsöka mer i detalj genom att t.ex. lägga till spårutskrifter för att testa koden medan du skriver den.

Exempelutskrift från körning av rättningsskriptet

OBS! Nedanstående utskrift är bara ett exempel på hur utskriften kan se ut. Den är inte kopplad till någon verklig inlämning.

#### POÄNG (100 poäng behövs för GODKÄND UPPG) ####

UPPG 1.1: 5 poäng.
UPPG 1.2: 5 poäng.
UPPG 1.3: 5 poäng.
UPPG 1.4: 5 poäng.
UPPG 1.5: 10 poäng.
UPPG 1.7: 10 poäng.
UPPG 1.8: 10 poäng.
UPPG 1.9: 10 poäng.
UPPG 1.10b: 5 poäng.
UPPG 1.11: 15 poäng.
UPPG 1.12: 15 poäng.


#### SAKNADE UPPGIFTER ####

Kontrollera stavning på din funktioner. Stora och små
bokstäver spelar roll.

UPPG 1.10a saknar funktion: 'first_in_list'
UPPG 1.10c saknar funktion: 'last_in_list'


#### FEL vid TEST ####

Felsök genom att ha testanrop längst ner i din kodfil och
skriv ut resultaten. Kontrollera också så att du har mellanrum
på rätt ställe och att stora/små bokstäver stämmer överrens.

UPPG 1.6: Fel påträffades.

#### ANTAL POÄNG: 95
#### Du är INTE godkänd på Pythonuppgifter 1.
#### 5 poäng saknas.

Skicka in rättningskod

Om uppgiften är godkänd så hittar du även ett stycke med en rättningskod. Detta är en komprimerad version av all data om din lösning och hur många poäng du fått.

Kopiera rättningskoden (se exempel nedan) och klistra in den i en textfil; en fil för varje rättningskod. För laboration 1 kommer du lämna in 3 filer, en för varje kapitel som ingår i första labben. Döp filerna till pyuppg1.txt, pyuppg2.txt och pyuppg3.txt. Motsvarande gäller för labb 2 (kapitel 4-6) och 3 (kapitel 7-9).

------------------------ KOPIERA FRÅN RADEN UNDER DENNA ------------------------
dXBwZzEvaW5mby50eHRVVAkAAz99zVc/fc1XdXgLAAEE9QEAAAQUAAAABcHLEcIgEADQO1VsA3FY
zVd1eAsAAQT1AQAABBQAAABQSwMEFAAAAAgAiIElSZnJPKxkAAAAcgAAABgAHABqb2RmbzAxLXB5
AjhLN2E/iophTDike9+T7dQCwWNePC0+AeaCoWBy89Bfgdcutnt01j4K/FR+qxQY1xzjgbdxud6+
AGpvZGZvMDEtcHl1cHBnMS9taW5pZmllZC5weVVUCQADP33NVz99zVd1eAsAAQT1AQAABBQAAACN
UEsDBAoAAAAAAIiBJUkAAAAAAAAAAAAAAAAQABwAam9kZm8wMS1weXVwcGcxL1VUCQADP33NVz99
kstugzAQRfd8hUU3pCGhRMomUlb9jLayDIzBjbEte4iavy/YPEJaqV0gM3fO3Bk/RGu0RWKZqnQb
VcCJBeysolxcIdmcojEm8SDEnjBWKFwAHyYhv/EAqyrqsJdrt7Jo4DPexo6p4NM5oNgAvTLrsSuT
HZyPM+/j5+OKZbZO2Gi+NJ+VuXZSVsVSKCgssMtqKssqkr+rYTmEwVxXoGUlJn6CPPXL4a4m6Lug
hxIjBdJCSJmwVncKU9W1BViqOTWgjYS78kBkj4Q3KrUqGYLqv/kMXZ66+/Yu37rQlgvrkArVb82N
47rHOd3by0eYEXrz6k86D7Rk/3De5ZO1hBJpeEY/6aDvy0aLEqa0L6xBgR32avQFWq2oYi0kxgIX
X+BS13H/E656EM/rVhPZ33xgH/KzQUQG5/Nvxxs8xl7LExr46Im89g8GoSLFjZhbK5TgAixJGkTj
TllWC2y6Yl/qNpOCo+Y8W7BN9A1QSwMEFAAAAAgAiIElSclUPoaqAAAAqAEAAB8AHABqb2RmbzAx
zZoKdEnH7GDmmeo9xVhT5JpzNVmFaOPAK6G5P1BLAwQUAAAACACIgSVJoN99PmsBAABgAwAAGwAc
LXB5dXBwZzEvcHl1cHBnMXRlc3QubG9nVVQJAAM/fc1XP33NV3V4CwABBPUBAAAEFAAAAOPiUgYC
hQD/wy1+7goahgYGCgX5h5fkpSskpWYc3lZWrJB2eFuRgru/izdQhYtCaECAu6YCSA8XF4itYKhn
aKVgCtWkBxMzwiJmjEXMBIuYqZWCoQG6oBk2QXNsghbYBC2xCRoaJGKx3tAgCatoMjZRoN8NMUWN
CgAAAAAAiIElSQAAAAAAAAAAAAAAABAAGAAAAAAAAAAQAO1BAAAAAGpvZGZvMDEtcHl1cHBnMS9V
VAUAAz99zVd1eAsAAQT1AQAABBQAAABQSwECHgMUAAAACACIgSVJmck8rGQAAAByAAAAGAAYAAAA
AAAAUEsBAh4DFAAAAAgAiIElSaDffT5rAQAAYAMAABsAGAAAAAAAAQAAAKSBAAEAAGpvZGZvMDEt
AAABAAAApIFKAAAAam9kZm8wMS1weXVwcGcxL2luZm8udHh0VVQFAAM/fc1XdXgLAAEE9QEAAAQU
UEQhIezoF+LoAw1noLShKUTYpVTh8BKk8C04vFQhoLIkIz+vtKAgPTOtRMFQkUtBgQsAUEsBAh4D
JUnJVD6GqgAAAKgBAAAfABgAAAAAAAEAAACkgcACAABqb2RmbzAxLXB5dXBwZzEvcHl1cHBnMXRl
cHl1cHBnMS9taW5pZmllZC5weVVUBQADP33NV3V4CwABBPUBAAAEFAAAAFBLAQIeAxQAAAAIAIiB
c3QubG9nVVQFAAM/fc1XdXgLAAEE9QEAAAQUAAAAUEsFBgAAAAAEAAQAegEAAMMDAAAAAA==
------------------------- KOPIERA T.O.M. RADEN OVANFÖR -------------------------

(OBS! Ovanstående rättningskod är ogiltig och bara ett exempel på hur utskriften kommer att se ut).


Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2026-01-08