1.1. Pre-Intermediate

1.1.1. Select

  • Complexity level: easy

  • Lines of code to write: 6 lines

  • Estimated time of completion: 5 min

  • Solution: solution/nested_select.py

English
  1. For given data input (see below)

  2. Write header (first line) to header variable

  3. Convert to list data from row 2, 6, 9 and add to output

  4. Convert to tuple data from row 12, 15, 16 and add to output

  5. Convert to dict data from row 18, 21 and add to output:

    • key -> index number (18 or 21)

    • value -> species name

  6. Add empty set to output

  7. Use only indexes

  8. Do not use for, while or slice()

Polish
  1. Dla danych wejściowych (patrz sekcja input)

  2. Zapisz nagłówek (pierwsza linia) do zmiennej header

  3. Przekonwertuj do list dane z wierszy 2, 6, 9 i dodaj do output

  4. Przekonwertuj do tuple dane z wierszy 12, 15, 16 i dodaj do output

  5. Przekonwertuj do dict dane z wierszy 18, 21 i dodaj do output:

    • klucz -> numer indeksu (18 or 21)

    • wartość -> nazwa gatunku

  1. Dodaj pusty set do output

  2. Użyj tylko indeksów

  3. Nie używaj for, while lub slice()

Input
INPUT = [
    ('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
    (5.8, 2.7, 5.1, 1.9, 'virginica'),
    (5.1, 3.5, 1.4, 0.2, 'setosa'),
    (5.7, 2.8, 4.1, 1.3, 'versicolor'),
    (6.3, 2.9, 5.6, 1.8, 'virginica'),
    (6.4, 3.2, 4.5, 1.5, 'versicolor'),
    (4.7, 3.2, 1.3, 0.2, 'setosa'),
    (7.0, 3.2, 4.7, 1.4, 'versicolor'),
    (7.6, 3.0, 6.6, 2.1, 'virginica'),
    (4.9, 3.0, 1.4, 0.2, 'setosa'),
    (4.9, 2.5, 4.5, 1.7, 'virginica'),
    (7.1, 3.0, 5.9, 2.1, 'virginica'),
    (4.6, 3.4, 1.4, 0.3, 'setosa'),
    (5.4, 3.9, 1.7, 0.4, 'setosa'),
    (5.7, 2.8, 4.5, 1.3, 'versicolor'),
    (5.0, 3.6, 1.4, 0.3, 'setosa'),
    (5.5, 2.3, 4.0, 1.3, 'versicolor'),
    (6.5, 3.0, 5.8, 2.2, 'virginica'),
    (6.5, 2.8, 4.6, 1.5, 'versicolor'),
    (6.3, 3.3, 6.0, 2.5, 'virginica'),
    (6.9, 3.1, 4.9, 1.5, 'versicolor'),
    (4.6, 3.1, 1.5, 0.2, 'setosa'),
]
The whys and wherefores
  • Using nested data structures

  • Using indexes

  • Type casting

1.1.2. Iris dataset

  • Complexity level: easy

  • Lines of code to write: 20 lines

  • Estimated time of completion: 10 min

  • Solution: solution/slice_iris.py

English
  1. For input data (see below)

  2. Use only slice

  3. Extract list features with measurements (every row must be tuple)

  4. Extract species name (every fifth element) and write to labels list

  5. Write unique species names to species set

Polish
  1. Dla danych wejściowych (patrz sekcja input)

  2. Użyj tylko slice

  3. Wyodrębnij listę features w pomiarami (każdy wiersz ma być krotką)

  4. Wyodrębnij nazwę gatunku (co piąty element) i zapisz do listy labels

  5. Zapisz unikalne nazwy gatunków do zbioru species

Input
INPUT = (
    5.8, 2.7, 5.1, 1.9, 'virginica',
    5.1, 3.5, 1.4, 0.2, 'setosa',
    5.7, 2.8, 4.1, 1.3, 'versicolor',
    6.3, 2.9, 5.6, 1.8, 'virginica',
    6.4, 3.2, 4.5, 1.5, 'versicolor',
    4.7, 3.2, 1.3, 0.2, 'setosa',
)
Output
features = [
    (5.8, 2.7, 5.1, 1.9),
    (5.1, 3.5, 1.4, 0.2),
    (5.7, 2.8, 4.1, 1.3),
    (6.3, 2.9, 5.6, 1.8),
    (6.4, 3.2, 4.5, 1.5),
    (4.7, 3.2, 1.3, 0.2),
]

labels = [
    'virginica',
    'setosa',
    'versicolor',
    'virginica',
    'versicolor',
    'setosa',
]

species = {
    'versicolor',
    'setosa',
    'virginica',
}
The whys and wherefores
  • Defining and using list, tuple, set

  • Slicing sequences

1.1.3. List[tuple] to List[dict]

English
  1. For input data (see below)

  2. Separate header and data

  3. Print List[dict]

    • key - name from the header

    • value - measurement or species

Polish
  1. Dla danych wejściowych (patrz sekcja input)

  2. Odseparuj nagłówek i dane

  3. Wypisz List[dict]

    • klucz: nazwa z nagłówka

    • wartość: wyniki pomiarów lub gatunek

Input
INPUT = [
    ('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
    (5.8, 2.7, 5.1, 1.9, 'virginica'),
    (5.1, 3.5, 1.4, 0.2, 'setosa'),
    (5.7, 2.8, 4.1, 1.3, 'versicolor'),
    (6.3, 2.9, 5.6, 1.8, 'virginica'),
    (6.4, 3.2, 4.5, 1.5, 'versicolor'),
    (4.7, 3.2, 1.3, 0.2, 'setosa'),
    (7.0, 3.2, 4.7, 1.4, 'versicolor'),
    (7.6, 3.0, 6.6, 2.1, 'virginica'),
    (4.9, 3.0, 1.4, 0.2, 'setosa'),
    (4.9, 2.5, 4.5, 1.7, 'virginica'),
    (7.1, 3.0, 5.9, 2.1, 'virginica'),
    (4.6, 3.4, 1.4, 0.3, 'setosa'),
    (5.4, 3.9, 1.7, 0.4, 'setosa'),
    (5.7, 2.8, 4.5, 1.3, 'versicolor'),
    (5.0, 3.6, 1.4, 0.3, 'setosa'),
    (5.5, 2.3, 4.0, 1.3, 'versicolor'),
    (6.5, 3.0, 5.8, 2.2, 'virginica'),
    (6.5, 2.8, 4.6, 1.5, 'versicolor'),
    (6.3, 3.3, 6.0, 2.5, 'virginica'),
    (6.9, 3.1, 4.9, 1.5, 'versicolor'),
    (4.6, 3.1, 1.5, 0.2, 'setosa'),
]
Output
output: List[dict] = [
    {'Sepal length': 5.8, 'Sepal width': 2.7, 'Petal length': 5.1, 'Petal width': 1.9, 'Species': 'virginica'},
    {'Sepal length': 5.1, 'Sepal width': 3.5, 'Petal length': 1.4, 'Petal width': 0.2, 'Species': 'setosa'},
    {'Sepal length': 5.7, 'Sepal width': 2.8, 'Petal length': 4.1, 'Petal width': 1.3, 'Species': 'versicolor'},
    ...
]
The whys and wherefores
  • Working with nested data structures

  • Iterating over dict and lists

1.1.4. Get elements from nested data structure

  • Complexity level: easy

  • Lines of code to write: 3 lines

  • Estimated time of completion: 10 min

  • Solution: solution/for_nested.py

English
  1. For input data (see below)

  2. Separate header from data

  3. Iterate over data

  4. Print species names ending with "ca" or "osa"

Polish
  1. Dla danych wejściowych (patrz sekcja input)

  2. Oddziel nagłówek od danych

  3. Iteruj po danych

  4. Wypisz nazwy gatunków kończące się na "ca" lub "osa"

Input
INPUT = [
    ('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
    (5.8, 2.7, 5.1, 1.9, {'virginica'}),
    (5.1, 3.5, 1.4, 0.2, {'setosa'}),
    (5.7, 2.8, 4.1, 1.3, {'versicolor'}),
    (6.3, 2.9, 5.6, 1.8, {'virginica'}),
    (6.4, 3.2, 4.5, 1.5, {'versicolor'}),
    (4.7, 3.2, 1.3, 0.2, {'setosa'}),
    (7.0, 3.2, 4.7, 1.4, {'versicolor'}),
    (7.6, 3.0, 6.6, 2.1, {'virginica'}),
    (4.6, 3.1, 1.5, 0.2, {'setosa'}),
]
The whys and wherefores
  • Accessing dict keys

  • Iterating over nested structure

1.1.5. Label encoder

English
  1. For input data (see below)

  2. Define:

    • features: List[tuple] - measurements

    • labels: List[int] - species

  3. Separate header from data

  4. To encode and decode labels (species) we need label_encoder: Dict[int, str]:

    • key - id (incremented integer value)

    • value - species name

  5. label_encoder must be generated from INPUT

  6. For each row add appropriate data to features, labels and label_encoder

  7. Print features, labels and label_encoder

  8. Output must be identical to output data (see below)

Polish
  1. Dla danych wejściowych (patrz sekcja input)

  2. Zdefiniuj:

    • features: List[tuple] - pomiary

    • labels: List[int] - gatunki

    • label_encoder: Dict[int, str] - słownik podmiany nazw gatunków

  3. Odseparuj nagłówek od danych

  4. Aby móc zakodować i odkodować labels (gatunki) potrzebny jest label_encoder: Dict[int, str]:

    • key - identyfikator (kolejna liczba rzeczywista)

    • value - nazwa gatunku

  5. label_encoder musi być wygenerowany z INPUT

  6. Dla każdego wiersza dodawaj odpowiednie dane do feature, labels i label_encoder

  7. Wypisz feature, labels i label_encoder

  8. Wynik ma być identyczny z danymi wyjściowymi (patrz sekcja output)

Input
INPUT = [
    ('Sepal length', 'Sepal width', 'Petal length', 'Petal width', 'Species'),
    (5.8, 2.7, 5.1, 1.9, 'virginica'),
    (5.1, 3.5, 1.4, 0.2, 'setosa'),
    (5.7, 2.8, 4.1, 1.3, 'versicolor'),
    (6.3, 2.9, 5.6, 1.8, 'virginica'),
    (6.4, 3.2, 4.5, 1.5, 'versicolor'),
    (4.7, 3.2, 1.3, 0.2, 'setosa'),
    (7.0, 3.2, 4.7, 1.4, 'versicolor'),
    (7.6, 3.0, 6.6, 2.1, 'virginica'),
    (4.9, 3.0, 1.4, 0.2, 'setosa'),
    (4.9, 2.5, 4.5, 1.7, 'virginica'),
    (7.1, 3.0, 5.9, 2.1, 'virginica'),
    (4.6, 3.4, 1.4, 0.3, 'setosa'),
    (5.4, 3.9, 1.7, 0.4, 'setosa'),
    (5.7, 2.8, 4.5, 1.3, 'versicolor'),
    (5.0, 3.6, 1.4, 0.3, 'setosa'),
    (5.5, 2.3, 4.0, 1.3, 'versicolor'),
    (6.5, 3.0, 5.8, 2.2, 'virginica'),
    (6.5, 2.8, 4.6, 1.5, 'versicolor'),
    (6.3, 3.3, 6.0, 2.5, 'virginica'),
    (6.9, 3.1, 4.9, 1.5, 'versicolor'),
    (4.6, 3.1, 1.5, 0.2, 'setosa'),
]
Output
from typing import List, Dict


features: List[tuple] = [
    (5.8, 2.7, 5.1, 1.9),
    (5.1, 3.5, 1.4, 0.2),
    (5.7, 2.8, 4.1, 1.3),
    (6.3, 2.9, 5.6, 1.8),
    (6.4, 3.2, 4.5, 1.5),
    (4.7, 3.2, 1.3, 0.2), ...]

labels: List[int] = [0, 1, 2, 1, 2, 0, ...]

label_encoder: Dict[int, str] = {
    0: 'virginica',
    1: 'setosa',
    2: 'versicolor'}
The whys and wherefores
  • dict lookups

  • Dynamic dict generating

  • dict reversal