Dzisiaj naszym zadaniem jest policzenie wstąpień liczb w zadanej liście. Dokładnie należy napisać funkcję przyjmującą listę jako parametr oraz zwracającą słownik gdzie kluczem jest dana liczba, a wartością ilość jej wystąpień.

Czyli dla listy lista = [1, 2, 2, 3, 4, 4, 5, 5, 5] nasza funkcja powinna zwrócić następujący słownik: {1: 1, 2: 2, 3: 1, 4: 2, 5: 3}

Czyli w naszej liście mamy tylko jedno wystąpienie cyfry 1, za to aż trzy wstąpienia cyfry 5.

Po pierwsze zastanówmy się co nam może się tutaj przydać. Pewnie Twoim pierwszym pomysłem byłoby przeiterowanie się po całej liście i w jakiś sposób zliczanie wystąpień poszczególnych znaków. Takim podejściem zyskalibyśmy coś takiego:

lista = [1, 2, 2, 3, 4, 4, 5, 5, 5]

def policz_wystapienia(lista):
  moj_slownik = {}
  for x in lista:
      if x not in moj_slownik:
          moj_slownik[x] = 1
      elif x in moj_slownik:
          moj_slownik[x] += 1

  return moj_slownik

print(policz_wystapienia(lista))

Output:

{1: 1, 2: 2, 3: 1, 4: 2, 5: 3}

Uruchom w edytorze

Cel osiągnięty. Jednak nie wygląda to za ładnie. Zróbmy to zatem w inny sposób. Użyjemy kolekcji set, która jest kolekcją bez powtórzeń. Zapoznamy się też z metodą count, którą wywołamy na rzecz listy. Zatem w tym podejściu nie będziemy iterować się po całej naszej liście, a po kolekcji niepowtarzalnych elementów naszej listy. Kod wyjaśni wszytko:

lista = [1, 2, 2, 3, 4, 4, 5, 5, 5]

def policz_wystapienia(lista):
    moj_set = set(lista)
    moj_dict = {}

    for x in moj_set:
        moj_dict[x] = lista.count(x)

    return moj_dict

print(policz_wystapienia(lista))

Output:

{1: 1, 2: 2, 3: 1, 4: 2, 5: 3}

Uruchom w edytorze

Prawda, że prościej ? I na koniec już chyba klasycznie zrobimy to wszytko w jednej linii 🙂

lista = [1, 2, 2, 3, 4, 4, 5, 5, 5]


def policz_wystapienia(lista):
    return {x:lista.count(x) for x in set(lista)}

print(policz_wystapienia(lista))

Output:

{1: 1, 2: 2, 3: 1, 4: 2, 5: 3}

Uruchom w edytorze

I to już jest piękne. Dobra robota 🙂

 

To jeszcze nie koniec

Po raz drugi w historii tego bloga jeden z czytelników a mianowicie Sławek zaproponował fajne rozwiązanie. Nie pozostaje nam nic innego jak podzielić się jego pomysłem na łamach bloga.

Sławek zasugerował użycie klasy Counter z modułu collections.

from collections import Counter

lista = [1, 2, 2, 3, 4, 4, 5, 5, 5]

def policz_wystapienia(lista):
  return dict(Counter(lista))

print(policz_wystapienia(lista))

Output:

{1: 1, 2: 2, 3: 1, 4: 2, 5: 3}