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.