W tym ćwiczeniu napiszemy sobie, na kilka sposobów, coś takiego jak frequency counter, czyli licznik wystąpień. Jest to swego rodzaju wprowadzenie do różnego rodzaju zadań algorytmicznych i rekrutacyjnych, które z takiego podejścia (liczenia wystąpień) będą korzystać, zatem coś, co zdecydowanie warto znać.

Piszemy funkcję, która przyjmuje listę i zwraca słownik zawierający elementy tej listy jako klucze oraz ilość wystąpień jako wartości. Albo po ludzku – piszemy licznik, który nam poda jakie elementy ile razy w liście występują, w postaci słownika.

Podejście pierwsze – defensywne if-else

W Pythonie istnieje taka rzecz, która sprawia, że próba pobrania ze słownika wartości, która nie istnieje, kończy się błędem.

A teraz nasze rozwiązanie:

def count_elements(arr):
    element_count = {}
    for element in arr:
        if element in element_count:
            element_count[element] += 1
        else:
            element_count[element] = 1
    return element_count


arr = [1, 2, 3, 4, 1, 2, 1]
print(count_elements(arr))  
# {1: 3, 2: 2, 3: 1, 4: 1}

Czyli tak – tworzymy słownik-licznik. Przechodzimy po elementach arr. Jeżeli element już został do słownika zapisany, to znaczy, że występuje po raz kolejny – zwiększamy jego wartość o 1.

Jeżeli element jeszcze w słowniku nie istnieje to znaczy, że to pierwsze wystąpienie – tworzymy taki klucz, jego wartość to 1.

Zwracamy słownik, gdzie klucze, to elementy tablicy, zaś wartości – ilość wystąpień.

Podejście drugie – metoda get

Istnieje metoda słowników o nazwie get. Ona pozwala wyciągnąć wartość klucza w danym słowniku. Gdy jednak klucz nie istnieje – nie zwraca ona błędu, jako wartość zwraca None.

Mało tego – możemy sami jako drugi argument podać domyślną wartość, jaka ma być zwrócona, gdy klucz nie istnieje.

def count_elements(arr):
    element_count = {}
    for element in arr:
        element_count[element] = element_count.get(element, 0) + 1
    return element_count


arr = [1, 2, 3, 4, 1, 2, 1]
print(count_elements(arr))  
#{1: 3, 2: 2, 3: 1, 4: 1}

Tworzymy słownik-licznik, przechodzimy po elementach w liście arr. I jak widać, do klucza-elementu dodajemy jego wartość plus 1.

Przy pierwszym znalezieniu – utworzymy klucz z naszym elementem i przypiszemy mu 0 + 1. Przy kolejnym znalezieniu – nadpisujemy ten klucz jego wartością + 1.

Podejście trzecie – Counter z collections

Jeżeli nie rozwiązujemy zadania „dla sztuki”, aby pokazać, że umiemy programować i myśleć logicznie czy też dla własnej zabawy bawić się kodem, tylko „na serio” potrzebujemy policzyć szybko ilość wystąpień danych elementów z tablicy – mamy od tego obiekt Counter z modułu collections:

from collections import Counter

def count_elements(arr):
    return Counter(arr)

arr = [1, 2, 3, 4, 1, 2, 1]
print(count_elements(arr))  
#Counter({1: 3, 2: 2, 3: 1, 4: 1})

Nam natomiast chodziło, aby odtworzyć jego działanie i to zrobiliśmy na dwa sposoby.