15. Python – operacje na zbiorach danych (listy, stosy, kolejki itd.) – ćwiczenia


Ćwiczenie:

Do zbioru danych:

przedmioty = {’matematyka’, 'polski’}

dodaj przedmiot o nazwie 'angielski’

Oczekiwany wynik:

  1. {’angielski’, 'matematyka’, 'polski’}

Ćwiczenie:

Podany jest słownik:

project_ids = {’01’: 'open’, ’02’: 'new’, ’03’: 'in progress’, ’04’: 'completed’}

Wykorzystując instrukcję warunkową sprawdź, czy status projektu z id = ’02’ jest ustawiony na 'new’. Jeśli tak, zmień ten status na 'open’.

W odpowiedzi wydrukuj słownik project_ids do konsoli.

Oczekiwany wynik:

  1. {’01’: 'open’, ’02’: 'open’, ’03’: 'in progress’, ’04’: 'completed’}

Ćwiczenie:

Napisz program, który sprawdzi czy podany element:

  1. item = '001′

występuje w liście:

  1. items = [’001′, '000′, '003′, '005′, '006′]

Jeżeli tak, to usuń ten element z listy. W odpowiedzi wydrukuj otrzymaną listę do konsoli.

Oczekiwany wynik:

  1. [’000′, '003′, '005′, '006′]

Ćwiczenie :

Pobierz od użytkownika tekst i przypisz go do zmiennej. Następnie:

  1. Zamień wszystkie litery na małe.
  2. Usuń spacje i kropkę jeżeli istnieją.
  3. Utwórz zbiór składający się z wszystkich liter w tak przetworzonym tekście.
  4. Odpowiednią metodą dla zbiorów usuń z tego zbioru wszystkie samogłoski {’a’, 'e’, 'i’, 'o’, 'u’}. Użyj metody difference()
  5. Wydrukuj długość zbioru przed i po przeprowadzonych operacjach.

Ćwiczenie :

Różnica symetryczna dwóch zbiorów to zbiór składający się z wszystkich elementów tych zbiorów oprócz elementów wspólnych. Dla dwóch zbiorów: A = {2, 4, 6, 8} oraz B = {4, 10} wyznacz różnicę symetryczną za pomocą metody symmetric_difference(). Wynik wydrukuj do konsoli.

Ćwiczenie :

Obsługujesz skrypt wysyłający reklamy do klientów. Twoje zadanie polega na wysłaniu reklam do klientów, którzy skorzystali tylko z jednej kampanii reklamowej. Masz dwa zbiory danych, id klientów, którzy skorzystali z kampanii reklamowej pierwszej i drugiej:

ad1 = {’001′, '002′, '003′}

ad2 = {’002′, '003′, '007′}

Wybierz id klientów, do których można wysłać kolejną reklamę (id, które nie pojawiły się dwa razy). Z pomocą przyjdzie ci metoda symmetric_difference()

Ćwiczenie :

Masz dwa zbiory z informacjami o klientach:

open = {1, 3, 5, 6, 8}

access = {2, 5, 8}

Wyświetl id klienta, który otworzył reklamę i zapisał się na kurs. (id pojawia się w obu zbiorach – intersection())

Ćwiczenie :

W zbiorze [’1001′, '1005′, '1007′, '1003′, '1009′, '1005′, '1001′, '1008′, '1001′, '1004′] zlicz wystąpienia elementu '1001′

Ćwiczenie :

Stwórz słownik, który przechowuje w indeksach numerycznych liczby od 1 do 10, a ich wartości są kwadratami indeksów. (np. {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49})

Ćwiczenie :

W podanym słowniku: {’Boombit’: '001′, 'CD Projekt’: '002′, 'Playway’: '003′} zamień miejscami indeksy z wartościami i wydrukuj wynik.

Ćwiczenie :

Z podanego zbioru danych: {’Boombit’: 22, 'CD Projekt’: 295, 'Playway’: 350} wyciągnij pary klucz:wartość dla wartości powyżej 100

Ćwiczenie z rozwiązaniem:

Zbuduj listę składającą się ze słowników mapujących kolejne cyfry od 1 do 9 włącznie na ich odpowiednie n-te potęgi, dla n = 1…5. Wynik wydrukuj do konsoli.

Pomocniczy wynik:

[

 {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9},

 {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81},

 {1: 1, 2: 8, 3: 27, 4: 64, 5: 125, 6: 216, 7: 343, 8: 512, 9: 729},

 …

]

Rozwiązanie

data = [{i: i**j for i in range(1, 10)} for j in range(1, 6)]

print(data)

Ćwiczenie z rozwiązaniem:

Dane są dwie listy:

przedmiot = [’PAM’, 'PPAI’, 'PPAD’]

oceny = [’pl’, 'spr’, 'projekt’]

Wykorzystując dict comprehension zbuduj poniższy słownik ustawiając wartości ocen na None:

{

’PAM’: {’pl’: None, 'spr’: None, 'projekt’: None},

’PPAI’: {’pl’: None, 'spr’: None, 'projekt’: None},

’PPAD’: {’pl’: None, 'spr’: None, 'projekt’: None}

}

Rozwiązanie:

data = {idx: {i: None for i in oceny} for idx in przedmiot}

print(data)

Ćwiczenie z rozwiązaniem:

Przekształć listę

przedmiot = [’PAM’, 'PPAI’, 'PPAD’]

w słownik z indeksami numerycznymi.

Rozwiązanie:

data = {key: val for key, val in enumerate(przedmiot)}

print(data)

Ćwiczenie :

Podana jest lista cen produktów netto:

netto = [5.5, 4.0, 9.0, 10.0]

Podatek VAT na te produkty wynosi 23%.

Policz cenę brutto dla każdego produktu. Cenę zaokrąglij do drugiego miejsca po przecinku. Otrzymaną listę wydrukuj do konsoli.

Ćwiczenie :

Podany jest poniższy słownik:

data = dict(zip((’a’, 'b’, 'c’, 'd’, 'e’, 'f’),(1, 2, 3, 4, 5, 6)))

Przekształć podany słownik w listę:

[[’a’, 1], [’b’, 2], [’c’, 3], [’d’, 4], [’e’, 5], [’f’, 6]]

i przypisz do zmiennej result. Wydrukuj zawartość zmiennej result do konsoli.

Projekt – SPRAWDZANIE POPRAWNOŚCI NAWIASÓW

Opis zadania

Twoim zadaniem jest napisanie programu, który sprawdza czy nawiasy w tekście są poprawnie domknięte.

Program musi obsługiwać trzy typy nawiasów:

  • Okrągłe: ( )
  • Kwadratowe: [ ]
  • Klamrowe: { }

Zasady poprawności

Nawiasy są poprawne gdy:

  1. Każdy nawias otwierający ma swój zamykający
  2. Nawiasy zamykają się w odpowiedniej kolejności
  3. Każdy nawias zamykający pasuje do ostatnio otwartego

Przykłady

POPRAWNE:

  • (a + b)
  • [1, 2, 3]
  • {x: 10}
  • (a + [b * c])
  • {(a + b) * [c - d]}
  • Pusty tekst (brak nawiasów)

NIEPOPRAWNE:

  • (a + b] – niewłaściwy typ zamykającego
  • ((a + b) – brak zamknięcia
  • (a + b)) – za dużo zamykających
  • ]a + b[ – zamykający przed otwierającym
  • {[}] – niewłaściwa kolejność

Przypomnienie: Jak działa STOS?

Przykład: sprawdzamy "{[()]}"

Krok po kroku:
1. Napotkano '{' → stos: ['{']
2. Napotkano '[' → stos: ['{', '[']
3. Napotkano '(' → stos: ['{', '[', '(']
4. Napotkano ')' → pasuje do '(' → zdejmij ze stosu → stos: ['{', '[']
5. Napotkano ']' → pasuje do '[' → zdejmij ze stosu → stos: ['{']
6. Napotkano '}' → pasuje do '{' → zdejmij ze stosu → stos: []
7. Stos pusty → POPRAWNE 

Pamiętaj: Zawsze zdejmujemy i sprawdzamy OSTATNI element ze stosu!


Część 1: Podstawowa wersja (5 punktów)

Napisz funkcję sprawdz_nawiasy(tekst) która:

  • Przyjmuje tekst jako parametr
  • Zwraca True jeśli nawiasy są poprawne
  • Zwraca False jeśli nawiasy są niepoprawne
def sprawdz_nawiasy(tekst):
    # Twój kod tutaj
    pass

# Testy
print(sprawdz_nawiasy("(a + b)"))        # True
print(sprawdz_nawiasy("(a + b]"))        # False
print(sprawdz_nawiasy("((a + b)"))       # False
print(sprawdz_nawiasy("{[()]}"))         # True

Wskazówki:

  1. Użyj STOSU (listy) stos = []
  2. Algorytm:
    • Przejdź przez każdy znak w tekście
    • Jeśli to nawias otwierający (, [, { → dodaj na stos
    • Jeśli to nawias zamykający ), ], } → sprawdź czy pasuje do ostatniego ze stosu
    • Na końcu stos musi być pusty
  3. Przydatne operacje: stos.append(znak) # Dodaj na stos stos.pop() # Zdejmij ze stosu len(stos) == 0 # Czy stos pusty?
  4. Jak sprawdzić czy pasują? pary = {'(': ')', '[': ']', '{': '}'}

Część 2: Rozszerzona wersja (5 punktów)

Ulepsz swoją funkcję aby:

  • Wypisywała dokładną pozycję błędu w tekście
  • Wypisywała typ błędu (np. „brak zamknięcia”, „zły typ”)
  • Ignorowała znaki niebędące nawiasami
def sprawdz_nawiasy_szczegolowo(tekst):
    # Zwróć krotkę: (czy_poprawne, komunikat)
    pass

# Przykład użycia:
wynik, komunikat = sprawdz_nawiasy_szczegolowo("(a + b]")
print(f"Poprawne: {wynik}")
print(f"Komunikat: {komunikat}")
# Wyjście:
# Poprawne: False
# Komunikat: Błąd na pozycji 6: oczekiwano ')', znaleziono ']'

Część 3: Dla ambitnych (bonus 3 punkty)

Dodaj funkcję napraw_nawiasy(tekst) która:

  • Próbuje naprawić tekst dodając brakujące nawiasy
  • Zwraca poprawiony tekst
def napraw_nawiasy(tekst):
    # Twój kod tutaj
    pass

# Przykład:
print(napraw_nawiasy("((a + b)"))   # "((a + b))"
print(napraw_nawiasy("(a + b"))     # "(a + b)"

Kryteria oceny

KryteriumPunkty
Podstawowa funkcja działa poprawnie3 pkt
Obsługa wszystkich typów nawiasów1 pkt
Ignorowanie innych znaków1 pkt
Szczegółowe komunikaty o błędach3 pkt
Wskazanie pozycji błędu2 pkt
Funkcja naprawiająca (bonus)3 pkt
RAZEM10 pkt (+3 bonus)

Przypadki testowe do sprawdzenia

Twój program powinien przejść te testy:

# Test 1: Proste przypadki
assert sprawdz_nawiasy("()") == True
assert sprawdz_nawiasy("[]") == True
assert sprawdz_nawiasy("{}") == True

# Test 2: Zagnieżdżone
assert sprawdz_nawiasy("([{}])") == True
assert sprawdz_nawiasy("{[()]}") == True

# Test 3: Z tekstem
assert sprawdz_nawiasy("(a + b) * [c - d]") == True
assert sprawdz_nawiasy("lista[0]") == True

# Test 4: Błędne
assert sprawdz_nawiasy("(]") == False
assert sprawdz_nawiasy("((()") == False
assert sprawdz_nawiasy("())") == False
assert sprawdz_nawiasy("{[(])}") == False

# Test 5: Pusty tekst
assert sprawdz_nawiasy("") == True
assert sprawdz_nawiasy("abc def") == True

print("Wszystkie testy zaliczone!")

Czas na wykonanie

  • Część 1: 15-20 minut
  • Część 2: 15-20 minut
  • Część 3: 20-30 minut (opcjonalnie)

Powodzenia!

Pamiętaj:

  • Używaj stosu (listy)
  • append() dodaje na stos
  • pop() (bez argumentu!) zdejmuje ze stosu
  • Sprawdzaj czy stos nie jest pusty przed pop()