Wpis z mikrobloga

Z cyklu Trudne Pytania Rekrutacyjne:

Dane wejściowe:

data = ['a', 'b', 'baab', 'aa']


Napisz funkcję która zwróci ilość wystąpień znaku przekazanego jako parametr, np:

print foo('a', data)

5


PS: Język dowolny

#python #naukaprogramowania
  • 48
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Patres: jedno z zestawu prostych pytań które pokazują jak zwinny ktoś jest w Pythonie. Prawidłowych rozwiązań jest kilka, fajnie jest zobaczyć jak można w ciągu dwóch minut przejść z kilku pętli do jednej linijki.

No, to da się to ulepszyć czy nie? :P
  • Odpowiedz
@co_to_sie_stanelo:
1) jest tu kilka fajnych rozwiązań, więc nie ma mowy o odsiewaniu ziar od plew.
2) problem nie jest życiowy. Problemem jest tutaj zły model danych i pytanie o operator do obsługi błędnego modelu. Szajs, sorry.
  • Odpowiedz
@co_to_sie_stanelo: Nie mam pomysły jakby to można było ulepszyć. Chyba, że chodzi o generator tak jak to pisze @Kiro:

def foo(znak, tab):
return sum((x.count(znak) for x in data))

Jak masz więcej takich "zagadek" to załóż własny tag. Chętnie go zaobserwuję ( ͡° ͜ʖ ͡°)
  • Odpowiedz
@Kiro: @Patres: to miałem na myśli; być może jest wolniejszy, ale właśnie o wyciągnięcie takich wniosków chodzi w pozornie prostych zadaniach takich jak to. Z jednej strony jest prędkość, z drugiej co się stanie gdy len(data) ~= dostępna pamięć.

Edit: @Patres: te nawiasy w sum są zbędne, domyślnie dostajemy generator expression w takiej sytuacji.
  • Odpowiedz
@Patres: Ogólnie zależy od kontekstu, generalnie na generatory patrzy się bardziej pod kątem pamięci niż szybkości. W skrócie, "ściągnięcie" każdego kolejnego elementu z generatora to pod spodem jeden call, podczas gdy dostęp do elementów w liście jest natychmiastowy.

PS. w tym przypadku jeszcze dochodzi domknięcie (w generatorze) i dostęp to zmiennych z funkcji wyżej

@co_to_sie_stanelo: @Patres: W większości przypadków jest to mikrooptymalizacja i nie ma sensu
  • Odpowiedz
dostęp do elementów w liście jest natychmiastowy


@Kiro: listę najpierw trzeba złożyć, alokacje i realokacje są stosunkowo drogie, można zgadywać, dyskutować, można napisać benchmark :-)

Tak jak pisałem wyżej, takie pytania pozwalają wyciągnąć ciekawe wnioski o wiedzy osoby "przesłuchiwanej". Niektórzy są zadowoleni, bo napisali działające rozwiązanie, inni będą rozkminiać czy przypadkiem pod spodem implementacja Pythona nie robi zbyt dużo szumu.

Jeśli po takim pytaniu ktoś zejdzie do szczegółów implementacji cPython...
  • Odpowiedz