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

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
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.

0

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

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]
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'))
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.

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

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]]
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.

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.

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