Program wypisujący słowa z największą ilością liter a

Odpowiedz Nowy wątek
2019-11-03 01:20
0

Witam,

Mam do napisania program, który z podanych słów na wejściu wypisze słowa, które zawierają najwięcej liter a. Jeśli jest kilka takich to ma wypisać wszystkie z nich.
Przykładowy input to: kabdaa, bbataabb, ababdabtc, aaabcdkb, aabckaaaafga.
Jak taki program napisać w Python?
Na razie zacząłem tak i nie mam pojęcia co dalej:

def func(word):
            x = 0
            for i in range(len(word)):
                      if(word[i] == 'a'):
                                 x += 1
            return x
edytowany 1x, ostatnio: Patryk Figiel, 2019-11-03 01:21

Pozostało 580 znaków

2019-11-03 04:02
4

count() zwraca ci ilość znaku dla napisu:

>>> 'abc'.count('a')
1
>>> 'aaa'.count('a')
3

Cały kod:

input_data = ['kabdaa', 'bbataabb', 'ababdabtc', 'aaabcdkb', 'aabckaaaafga']
output_list = []
max_count = 0
for item in input_data:
    count = item.count('a')
    if count > max_count:
        output_list[:] = [] # output_list.clear() in Python 3
        max_count = count
        output_list.append(item)
    elif count == max_count:
        output_list.append(item)
print(output_list)

Zbieram elementy, których count('a') jest równe największemu dotychczas znalezionemu, jak znajdę większy to czyszczę wynik i zaczynam zbierać od początku.

Pozostało 580 znaków

2019-11-03 13:59
0

Ok, spróbuje tak zrobić.
Dziękuję bardzo

Pozostało 580 znaków

2019-11-03 14:15
1

Można też w bardziej kompaktowy sposób. Używając podobnych oznaczeń co @Spearhead:

input_data = ['kabdaa', 'bbataabb', 'ababdabtc', 'aaabcdkb', 'aabckaaaafga']
max_a_count = max(word.count('a') for word in input_data)
output_data = [word for word in input_data if word.count('a') == max_a_count]
edytowany 2x, ostatnio: gryxon, 2019-11-03 14:29
"troche" mnie ubiegles, ale moje jest za to odporne na puste listy ;) - katelx 2019-11-03 14:37
Masz mnie! Łatwo to naprawić defaultową wartością w funkcji max :p - gryxon 2019-11-03 14:43

Pozostało 580 znaków

2019-11-03 14:34
1

chyba troche bardziej pythonowo a na pewno krocej:

def filter_by_max_number_of_char(words, c):
    get_n = lambda w: w.count(c)
    max_n = get_n(max(words, default=0, key=get_n))
    return [w for w in words if get_n(w) == max_n]

test

print(filter_by_max_number_of_char(['kabdaa', 'bbataabb', 'ababdabtc', 'aaabcdkb', 'aabckaaaafga'], 'a'))

Pozostało 580 znaków

2019-11-03 15:06
0

Można też w bardziej kompaktowy sposób.

Przechodzisz po wejściu dwa razy. Jeżeli słowa lecą z stdin, trzeba będzie je wszystkie wrzucić do pamięci. Bardzo brzydko. Takie kody to w czwartej lidze.

Uznałem, że pokazanie funkcyjnego podejścia początkującemu programiście za dodaną wartość edukacyjną. Kod jest czytelniejszy od wersji czysto imperatywnej. W znacznej większości sytuacji czytelność kodu jest ważniejsza od jego wydajności. Szczególnie gdy rozmawiamy o Pythonie... :) - gryxon 2019-11-03 15:39

Pozostało 580 znaków

2019-11-03 16:26
2

Przechodzisz po wejściu dwa razy.

liczy sie czytelnosc a nie przedwczesne optymalizacje nie poparte benchmarkiem

Jeżeli słowa lecą z stdin, trzeba będzie je wszystkie wrzucić do pamięci.

i ty juz wiesz ze tej pamieci braknie ;)

Bardzo brzydko. Takie kody to w czwartej lidze.

bzdura, wlasnie przedwczesne optymalizacje i wymyslanie dodatkowych wymagan na etapie prototypowania to malostkowosc i domena gimbusow i/lub architektow. tu chodzi o przedstawienie prostego rozwiazania a nie obsluzenie wydumanych wyjatkowych sytuacji

Pozostało 580 znaków

2019-11-03 17:37
0

Lista wszystkich słów, które zawierają maksymalną liczbę wystąpień litery a.

from collections import Counter
input_data = ['kabdaa', 'bbataabb', 'ababdabtc', 'aaabcdkb', 'aabckaaaafga']
[w for w in input_data if w.count('a') == max(enumerate(l['a'] for l in map(dict, map(Counter, input_data))), key=lambda x: x[1])[1]]
edytowany 2x, ostatnio: Pyxis, 2019-11-03 18:05

Pozostało 580 znaków

2019-11-03 18:08
0

funkcyjne podejście
dodana wartość edukacyjna

Uczysz, że kod funkcyjny == kod nieoptymalny?

Kod jest czytelniejszy

Kod Spearheada nie jest trudny do zrozumienia. Mnie wystarczył jeden rzut oka.

edytowany 1x, ostatnio: Mózg, 2019-11-03 18:18

Pozostało 580 znaków

2019-11-03 18:54
0
Mózg napisał(a):

funkcyjne podejście
dodana wartość edukacyjna

Uczysz, że kod funkcyjny == kod nieoptymalny?

Kod jest czytelniejszy

Kod Spearheada nie jest trudny do zrozumienia. Mnie wystarczył jeden rzut oka.

Nie rozumiem o co Tobie w tym momencie chodzi. Po pierwsze, uważam, że w tym problemie wydajność nie ma większego znaczenia. Po drugie, uważam, że warto było pokazać nowej osobie alternatywę, która skróciła kod 3-krotnie.

Po trzecie, jestem wstanie podać Ci zestaw danych dla których to moje rozwiązanie będzie wydajniejsze. W przypadku gdy nie zapamiętujesz inputu to istnieje możliwośći, że w worst case i tak zajmiesz nie potrzebnie pamięć. Przykładowe dane wejściowe: [baa, caa, daa, eaa, ..., zaa, aaaaaaaaaaaaaa]. Jedyna rzecz o którą bym się przyczepił to to, że dwa razy liczę wystąpienia litery 'a' dla każdego słowa.

edytowany 4x, ostatnio: gryxon, 2019-11-03 19:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0