{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Labinar IN1000 Uke 3\n",
    "\n",
    "Stikkord:\n",
    "\n",
    "* Enkle lister\n",
    "* Nøstede lister\n",
    "* Mengder\n",
    "* Mappinger (ordbøker)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 0\n",
    "\n",
    "* Hva er en liste?\n",
    "* Hva slags ting gjør du med f.eks. en handleliste eller en gjøremålsliste? \n",
    "\n",
    "Diskuter i grupper."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Lister (enkle)\n",
    "\n",
    "Vi har hittil laget variabler på en verdi, hva om man vil holde på/lagre flere verdier?\n",
    "\n",
    "Da kan man lage en liste!\n",
    "\n",
    "Lister har dynamisk størrelse, dvs. Dersom man legger til ett element blir listen en størrelse større, dersom man fjerner ett element blir listen en størrelse mindre.\n",
    "\n",
    "\n",
    "Man kan ha lister med forskjellige elementer:\n",
    "\n",
    "Eksempler:\n",
    "\n",
    "```python\n",
    "tallListe = [2, 4, 6, 7]\n",
    "navneListe = [\"Anne\", \"Per\", \"Lisa\"]\n",
    "tomListe = []\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "# Oppgave 1\n",
    "\n",
    "Hvor mange elementer er det i listene?\n",
    "\n",
    "```python\n",
    "liste = [0]\n",
    "\n",
    "liste1 = [1, 2, 3]\n",
    "\n",
    "liste2 = [3, 3, 5, 7]\n",
    "\n",
    "```\n",
    "```python\n",
    "liste3 = [\"A\", \"BC\", \"D\", \"E\", \"F\"]\n",
    "\n",
    "liste4 = [\"mange elementer i denne listen\"]\n",
    "\n",
    "liste5 = []\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "notes"
    }
   },
   "source": [
    "Tegn opp listene.\n",
    "\n",
    "I en liste begynner indekseringen på 0.\n",
    "\n",
    "F.eks. ```liste[3]``` refererer til det **fjerde** elementet i listen"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Oppgave 2\n",
    "Ta utgangspunkt i listene fra oppgave 1.\n",
    "\n",
    "### 2.1 Hva ligger på indexene?\n",
    "```python\n",
    "liste3 [4]\n",
    "liste1 [0]\n",
    "liste4 [1]\n",
    "liste3 [5]\n",
    "```\n",
    "\n",
    "### 2.2 På hvilken index ligger:\n",
    "\n",
    "5 (i liste2):\n",
    "\n",
    "“BC” (i liste3) :\n",
    "\n",
    "1 (i liste1):\n",
    "\n",
    "“E” (i liste3): \n",
    "\n",
    "### 2.3 Tegn opp hvordan liste3 ser ut."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Noen nyttige listeoperasjoner\n",
    "\n",
    "``` len(liste) ``` gir lengden på listen.\n",
    "\n",
    "``` liste.insert(index, element) ``` setter inn element på angitt indeks.\n",
    "\n",
    "```liste.append(element)``` setter inn nytt element på slutten av listen.\n",
    "\n",
    "```liste.remove(element)``` fjerner angitt element fra listen\n",
    "\n",
    "```liste.pop(index)``` fjerner (og returnerer) element på angitt indeks\n",
    "\n",
    "## Magisk triks:\n",
    "```liste.pop(-1) ``` da slettes det siste elementet(!)\n",
    "\n",
    "## Utskrift\n",
    "```print(\"Liste: \", liste)``` skriver ut -> Liste: 1, 2, 3\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "liste = [1, 2, 3]\n",
    "print(liste)\n",
    "\n",
    "print(len(liste))\n",
    "\n",
    "liste.insert(1, 7)\n",
    "print(liste)\n",
    "\n",
    "liste.append(9)\n",
    "print(liste)\n",
    "\n",
    "liste.remove(2)\n",
    "print(liste)\n",
    "\n",
    "liste.pop(-1)\n",
    "print(liste)\n",
    "\n",
    "print(\"Liste: \", liste)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Nøstede lister\n",
    "\n",
    "Nøstede lister kan sees på som lister i lister.\n",
    "\n",
    "## Koffert-eksempel:\n",
    "\n",
    "Vi har en mindre bag med “toalettsaker”, vår første liste:\n",
    "\n",
    "```python\n",
    "toalettsaker = [\"tannborste\" , \"haarborste\", \"tannkrem\"]\n",
    "```\n",
    "\n",
    "I tillegg har vi en mindre bag med klær:\n",
    "```python\n",
    "klaer = [\"jakke\", \"bukse\", \"sokker\", \"undertoy\"]\n",
    "```\n",
    "\n",
    "Og til slutt en liten bag med diverse:\n",
    "```python\n",
    "div = [\"kamera\", \"lommebok\", \"pass\", \"mobillader\"]\n",
    "```\n",
    "\n",
    "For å samle alle småbaggene når vi skal på tur legger vi dem i en koffert:\n",
    "```python\n",
    "koffert = [toalettsaker, klaer, div]\n",
    "```\n",
    "\n",
    "Koffert-lista vil nå være en liste som \"inneholder\" lister"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "# Oppgave 4\n",
    "\n",
    "Vi har listen “koffert”, hvordan vil utskriften av denne se ut? Og hvordan kan vi tegne opp denne?\n",
    "\n",
    "Prøv å gjør dette uten å kjøre koden først."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "# Oppgave 4, koffert-eksempel\n",
    "\n",
    "toalettsaker = [\"tannborste\" , \"haarborste\", \"tannkrem\"]\n",
    "klaer = [\"jakke\", \"bukse\", \"sokker\", \"undertoy\"]\n",
    "div = [\"kamera\", \"lommebok\", \"pass\", \"mobillader\"]\n",
    "\n",
    "koffert = [toalettsaker, klaer, div]\n",
    "\n",
    "print(koffert)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "Om dere har ekstra tid, prøv å svar på dette:\n",
    "\n",
    "## Minioppgave:\n",
    "\n",
    "Hva er verdien til:\n",
    "\n",
    "```python\n",
    "koffert[1][1]\n",
    "koffert[2][0]\n",
    "koffert[0][0]\n",
    "```\n",
    "\n",
    "Og hvordan “henter man frem”\n",
    "```python\n",
    "“mobillader”\n",
    "“sokker”\n",
    "“haarborste”\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "print(koffert[1][1])\n",
    "print(koffert[2][0])\n",
    "print(koffert[0][0])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Mengder (set)\n",
    "\n",
    "I dette faget skal dere bli gode på lister, men dere skal også ha kjennskap til set.\n",
    "\n",
    "En mengde lages *nesten* likt som en liste\n",
    "\n",
    "Syntaks:\n",
    "```python\n",
    "mengde = {element, element2, element3, ...}\n",
    "```\n",
    "\n",
    "Eksempel:\n",
    "```python\n",
    "navn = {\"Kari\", \"Per\", \"Ola\"}\n",
    "```\n",
    "\n",
    "Mengder har ingen spesifikk rekkefølge på elementene, ingen indeksering.\n",
    "\n",
    "**Allikevel:** fordelen med set fremfor lister er at operasjoner på dem er mye raskere enn operasjoner på lister."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Sammenligning\n",
    "OG fordel siden hvis vi vil sjekke om to sett er like så vil det se slik ut:\n",
    "(hvilken man bruker er avhengig av hva vi ser etter).\n",
    "\n",
    "Med mengder:\n",
    "\n",
    "```python\n",
    "navn = {\"Kari\", \"Per\", \"Ola\"}\n",
    "navn2 = {\"Per\", \"Ola\", \"Kari\"}\n",
    "\n",
    "if navn == navn2 :\n",
    "```\n",
    "evalueres til sant fordi begge inneholder de samme elementene, sett er uavhengig av rekkefølgen.\n",
    "\n",
    "Men med lister\n",
    "```python\n",
    "navn = [\"Kari\", \"Per\", \"Ola\"]\n",
    "navn2 = [\"Per\", \"Ola\", \"Kari\"]\n",
    "\n",
    "if navn == navn2 :\n",
    "```\n",
    "evalueres til usant selv om begge inneholder de samme elementene, så er de i ulik rekkefølge og dermed ikke like lister."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Litt div om lister\n",
    "Tom mengde lages slik:\n",
    "```python\n",
    "mengde = set()\n",
    "```\n",
    "\n",
    "IKKE: mengde = {}\n",
    "\n",
    "## Nyttige operasjoner man kan bruke på set:\n",
    "\n",
    "#### Konvertere liste til mengde:\n",
    "```python\n",
    "navn = [\"Kari\", \"Per\", \"Ola\"]\n",
    "navn_mengde = set(navn) # mao. På formen -> set(liste)\n",
    "menge.add(element) # legge til nytt element i mengden\n",
    "```\n",
    "\n",
    "#### Fjerne element fra listen:\n",
    "\n",
    "```python\n",
    "mengde.discard(element)\n",
    "```\n",
    "fjerner element fra listen, gjør ingenting dersom elementet ikke finnes i listen.\n",
    "\n",
    "```python\n",
    "mengde.remove(element)\n",
    "```\n",
    "fjerner element fra listen, får ett unntak dersom elementet ikke finnes i mengden (skal lære mer om unntak senere).\n",
    "\n",
    "#### Fjerne alle elementer i listen\n",
    "```python\n",
    "mengde.clear()\n",
    "```\n",
    "fjerner alle elementer i mengden, gjør mengden tom.\n",
    "\n",
    "#### etc.\n",
    "```python\n",
    "len(<mengde>)\n",
    "```\n",
    "finner antall elementer i mengden."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Mappinger\n",
    "\n",
    "Også kalt ordbøker/dictionary i python.\n",
    "\n",
    "## Diskusjon\n",
    "\n",
    "* Hva er en ordbok?\n",
    "* Hva slags ting gjør du med en ordbok?\n",
    "\n",
    "Her er det snakk om ordbok som dere kjenner fra ikke-programmering. Feks. en norsk-engelsk ordbok. Da kan man slå opp ett norsk ord, og se det engelske ordet av samme betydning.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "* En ordbok er en beholder som holder på par av nøkler og verdier.\n",
    "* Hver nøkkel i ordboken er knyttet til én verdi.\n",
    "\n",
    "Syntaks:\n",
    "```python\n",
    "ordbok = {nøkkel : verdi, nøkkel2 : verdi2, ...}\n",
    "```\n",
    "\n",
    "Eksempel:\n",
    "```python\n",
    "kontakter = {\"Kari\" : 47543234, \"Ola\" : 76554532, \"Martin\" : 99543367}\n",
    "```\n",
    "\n",
    "I stedet for å bruke indeksering som i lister, bruker man nøkkelen (i dette eksempelet navn) for å hente ut verdier.\n",
    "\n",
    "En tom ordbok lages slik:\n",
    "```python\n",
    "tomOrdbok = {}\n",
    "```"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "outputs": [],
   "source": [
    "kontakter = {\"Kari\" : 47543234, \"Ola\" : 76554532, \"Martin\" : 99543367}\n",
    "print(\"Kari sitt telefonnummer er \", kontakter[\"Kari\"])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "subslide"
    }
   },
   "source": [
    "## Nyttige operasjoner man kan bruke på ordbøker\n",
    "\n",
    "#### Legge til/endre\n",
    "```python\n",
    "ordbok[nokkel] = verdi\n",
    "```\n",
    "vil legge til nytt element i ordboken ELLER endre på eksisterende.\n",
    "\n",
    "Eksempel:\n",
    "```python\n",
    "kontakter[“Per”] = 45667990\n",
    "```\n",
    "dersom “Per” allerede finnes i ordboken vil verdien til per endres.\n",
    "\n",
    "#### Fjerne nøkkel og verdi\n",
    "```python\n",
    "ordok.pop(nøkkel)\n",
    "```\n",
    "vil fjerne nøkkelen og verdien.\n",
    "\n",
    "Eksempel:\n",
    "```python\n",
    "kontakter.pop(\"Per\")\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Kodestil\n",
    "\n",
    "* Man ønsker kode som er forståelig og enkel å lese\n",
    "* Vi kan kikke litt nærmere på [PEP 8](https://www.python.org/dev/peps/pep-0008/)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# Neste uke\n",
    "\n",
    "* while-løkker\n",
    "* for-løkker med teller\n",
    "* for-løkker på liste"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
