# Lexikon

Under den här fliken kommer vi fördjupa oss i en ny datatyp som heter lexikon. Lexikon används för att lagra mer sofistikerad information än en lista. Exempelvis kan vi ha ett särskilt objekt i en lista (kallad nyckel) och för den nyckeln tilldelar vi olika värden.

## Defininera ett lexikon

Exempelvis om vi skulle göra ett lexikon över en inköpslista så skrivs det på följande sätt.

```python

inköpslista = {'äpplen': 15, 'apelsin': 10, 'banan': 10, 'paprika': 25} 
    
```

I exemplet ovan skapar vi ett lexikon och tilldelar nyckel och värde. Det finns även andra situationer där vi har olika nycklar som vi vill tilldela fler än ett värde.

Nedan visas ett exempel på hur man kan använda ett lexikon för att hålla reda på olika böcker under olika kategorier.

```python
bibliotek = {'Skräck': ['It', 'Dracula'], 'Drama': ['Frankenstein', 'The Shining'], 'Fantasy': ['The Lord of the Rings', 'The Hobbit']}
```

I exemplet ovan skapar vi ett lexikon som innehåller olika nycklar, i det här fallet kategorier. Under kategorierna blir det i det här fallet en lista som är värdet som är tilldelat till listan. 

Vi vet från tidigare att listor är smidiga att använda för att de är lätta att redigera. Exempelvis att lägga till fler värden, att ta bort ett värde, eller att hitta ett specfikt värde i listan.

## Användning av lexikon

För att exemplifiera hur ett ett lexikon kan användas och varför det är smidigt ska vi ska återkomma till exemplet med vår `inköpslista`.

#### Översikt av lexikonet

Vi börjar med att vilja se alla nycklar vi har i vårt lexikon, då skriver vi följande:

```python

print(inköpslista.keys())

```

Om vi vill se alla värden för alla nycklar i lexikonet skriver vi:

```python

print(inköpslista.values())

```

#### Åtkomst till nycklar och värden

Säg att vi vill veta se värdet av en nyckel i ett lexikon, då skriver vi på följande sätt:

```python

print(inköpslista['apelsin'])

```

#### Ändra värden på nycklar
Det ger oss `apelsin`-nyckelns nuvarande värde, vilket är 10. Säg att vi skulle vilja redigera det värdet. Då skriver vi:

```python

inköpslista['apelsin'] = 25
print(inköpslista['apelsin'])

```

Nu har vi tilldelat värdet på `apelsin` till 25. 

#### Lägg till fler nycklar

Vi kan nu välja att vilja lägga till en till nyckel till vårt lexikon. Då skriver vi:

```python

inköpslista['anannas'] = 20
print(inköpslista)

```

#### Ta bort nycklar

Vi kan nu välja att vilja ta bort ett nyckel från lexikonet. Då skriver vi:

```python

inköpslista.pop('banan')
print(inköpslista)
```

#### Loopar och lexikon

Vi kan nu återkomma till exempelvis att vi vill loopa igenom alla nycklar i lexikonet. Då skriver vi:

```python

for nyckel in inköpslista.keys():
    print(nyckel)

```

Om vi vill loopa igenom alla värden i lexikonet skriver vi:

```python

for värde in inköpslista.values():
    print(värde)

```

## Övningar till avsnittet

<!-- start-övningar -->
### Övning 7.1

Skapa ett program som tar in ett lexikon med matvaror och deras kostnad, programmet skriver ut alla priser.

```{admonition} Tips
:class: Hint dropdown

Använd en for-loop, ta inspiration längre upp på fliken från "Loopar och lexikon".

```

### Övning 7.2

Använd samma lexikon som från övning 7.1 för att skriva ut alla nycklar (matvaror) i lexikonet.

```{admonition} Tips
:class: Hint dropdown

Använd en for-loop, ta inspiration längre upp på fliken från "Loopar och lexikon".

```
### Övning 7.3

Utgå från följande lexikon:

```python
betyg = {'Anna': A, 'Bengt': C, 'Cecilie': E, 'Dennis': D, 'Erik': B}
```

Skapa en funktion som tar en nyckel som input och returnerar betyget.

```{admonition} Tips
:class: Hint dropdown

Kopiera först lexikonet, sedan skapa en funktion som tar en nyckel som input och returnerar betyget.
```

### Övning 7.4

Utgå från följande lexikon:

```python
resultat = {"Ali": 78, "Bea": 45, "Chen": 62, "Stina": 90, "Erik": 49}
```

Skapa en funktion som tar en nyckel som input och säger om personen är godkänd på provet, gränsen för att bli godkänd går vid 50 poäng.

```{admonition} Tips
:class: Hint dropdown

Kopiera först lexikonet, sedan skapa en funktion som tar en nyckel som input, bestäm sedan personens poäng, gör sedan en if- och else-sats för att avgöra om personen är godkänd. Returnera sedan tillbaka om personen är godkänd eller inte.

```
### Övning 7.5

Utgå från följande lexikon:

```python
försäljning = {"måndag": 1200, "tisdag": 950, "onsdag": 1100, "torsdag": 800, "fredag": 1300}
```

Skapa en funktion som beräknar hur mycket de har tjänat på sin försäljning på hela veckan.

```{admonition} Tips
:class: Hint dropdown

Kopiera först lexikonet, sedan skapa en funktion som beräknar hur mycket de har tjänat på sin försäljning på hela veckan. Returnera sedan tillbaka summan.
```

### Övning 7.6  

Utgå från följande lexikon:

```python
lager = {"penna": 10, "sudd": 5, "linjal": 0, "stift": 15}
```

Skapa en funktion som skriver ut de nycklarna som behöver fyllas på, alltså för varje nyckel som har 0 i lagret.

```{admonition} Tips
:class: Hint dropdown

Kopiera först lexikonet, sedan skapa en funktion som tar lexikonet som parameter, funktionen tittar sedan på alla värden i lexikonet, om lexikonet har värde 0, skriv ut nyckeln.
```
### Övning 7.7
Utgå från följande lexikon:

```python
temperaturer = {"måndag": 18, "tisdag": 22, "onsdag": 20, "torsdag": 25, "fredag": 26}
```
Skapa en funktion som räknar ut hur många dagar temperaturen var mellan 20 grader och 25 grader.

```{admonition} Tips
:class: Hint dropdown

Kopiera först lexikonet, sedan skapa en funktion som tar lexikonet som parameter, funktionen tittar sedan på alla värden i lexikonet, om lexikonet har värde mellan 20 och 25, spara antalet i en variabel som heter antal_dagar. Returnera sedan tillbaka antal_dagar.
```

### Övning 7.8
Utgå från följande lexikon:

```python
poäng = {"Anna": 45, "Erik": 60, "Sara": 30, "Bengt": 50}
```
Skapa en funktion som ger alla personer 5 mer poäng.

```{admonition} Tips
:class: Hint dropdown
Kopierat först lexikonet, skapa sedan en funktion som tar lexikonet som parameter och byter lägger till 5 poäng, returnera sedan tillbaka lexikonet. Uppgiften är lättast att lösa genom att göra ett nytt lexikon som returneras.
```


### Övning 7.9

Skapa en funktion som tar en lista med namn som indata och returnerar en dictionary där varje namn är en nyckel och värdet är längden på namnet.

```{admonition} Tips
:class: Hint dropdown  

Tänk på hur du kan iterera över en lista och lägga till nyckel-värde-par i en dictionary. Du kan använda en tom dictionary och fylla på den med `dict[key] = value`.

```

### Övning 7.10

Skapa en funktion som tar en lista med ord och returnerar en dictionary där varje ord är en nyckel och värdet är hur många gånger ordet förekommer i listan.


```{admonition} Tips
:class: Hint dropdown

Använd en dictionary för att hålla reda på antalet förekomster. Du kan använda `if key in dict:` för att kontrollera om nyckeln redan finns.

```
<!-- end-övningar -->

<!-- start-projekt -->

## Projekt med lexikon

I det här projektet ska vi skapa ett program som håller reda på filmer och hur dem betygssätts.

#### Steg 1
Skapa ett exceldokument med följande struktur:

```{list-table}
:header-rows: 1

* - Film
  - Betyg
* - The Shawshank Redemption
  - 9.3
* - The Godfather
  - 9.2
* - The Dark Knight
  - 9
* - Pulp Fiction
  - 8.9
* - Schindler's List
  - 8.9
* - The Lord of the Rings
  - 8.8
```

#### Steg 2
Skapa en funktion som tar en excelfil som input och returnerar en dataframe med informationen.

#### Steg 3
Skapa en funktion som tar ditt dataframe som sedan skapar ett lexikon med filmnamnen som nycklar och betygen som värden. Funktionen returnerar lexikonet.

#### Steg 4
Skapa en funktion som lägger till en ny film till lexikonet.

#### Steg 5
Skapa en funktion som hittar det högsta betyget och returnerar vilken film som har det högsta betyget.

#### Steg 6
Skapa en funktion som hittar det lägsta betyget och returnerar vilken film som har det lägsta betyget.

#### Steg 7
Skapa ett funktion som beräknar medelbetyget och returnerar det.

#### Steg 8
Skapa en mainfunktion som du kan använda för att anropa alla olika funktioner.

<!-- end-projekt -->