Hej Wonsy, ogarnia ktos wyszukiwanie w slownikach w Pythonie? Mam maly problem i nie wiem jak go ugryzc
Opisz problem, na pewno ktoś pomoże.
Mam do napisania funkcje, ktora wyszukuje czy slowo wpisane przez uzytkownika jest w slowniku. Jezeli jest to podac wartosc tego klucza, jezeli nie to wyswietlic - nie znaleziono i nic wiecej. Uzylem do tego for loop.
directory = {'name1':'phone1',
'name2':'phone2',
'name3':'phone3'}
def function():
user_input = input('Enter name: ')
for key in directory.keys():
if key == user_input:
print(directory[key])
break
else:
print('not found')
Niestety przy kazdej iteracji dostaje - not found, jezeli key != value
>>> function()
Enter name: name3
not found
not found
phone3
>>> function()
Enter name: name4
not found
not found
not found
Powinno to wygladac to w ten sposob:
>>> function()
Enter name: name3
phone3
>>> function()
Enter name: name4
not found
Znalazem rozwiazanie na stackoverflow i wyglada to w ten sposob:
def function():
search = input('Enter name: ')
found = None
for key, value in directory.items():
if search in key:
if found is None:
found = value
else:
break
else:
if found is None:
print('nothing found')
else:
print('match found ' + found)
Niestety nie do konca rozumie dzialanie tej funkcji. Czy ktos moze wyjasnic mi jak 5 latkowi jak ona dziala? Zwlaszcze dlaczego musialem ustalic zmienna found oraz to co sie dziej w drugim if. Thanks from the mountain.
Sposób ze stacka jest ok. Chodzi o to ze definiujesz na początku zmienna o wartości nullowej.
W pętli ja nadpisujesz, o ile if będzie zwracał true.
Następnie sprawdzasz zmienna z początku i zwracasz czy znaleziono (bo nadpisałeś zmienna) lub ze nie znaleziono bo zmienna się nie zmienila
if found is None:
Wlasnie tego nie moglem skumac ale juz chyba wiem o co chodzi:
Jezli found = None (nie zostal nadpisany wczesniej) to found = value. Jezeli found != None (zostal nadpisany wczesniej) przerwij petle.
Tak. W momencie nadpisania zmiennej found nie ma potrzeby kontynuowania pętli i jest przerywana.
Dzieki Maciej za wyjasnienie:grin:
Ale po co iterować się po całym słowniku? Słownik pod spodem ma hashmapę, więc korzystając z API sprawdzenie czy dany klucz występuje w słowniku ma złożoność O(1). Porównując ręcznie każdy klucz zwiększasz złożoność do O(n)
Dopiero sie ucze, masz jakis link do tego o czym piszesz ?
A po co mu rozpisujesz jak dla developera? chłopak się uczy więc trzeba mu tłumaczyć prostym językiem, a nie chwalić się swoją wiedzą.
Poprosze o link do dokumentacji, tak z ciekawosci.
Generalnie w tym miejscu użyłbym get na słowniku. Z tego co zrozumiałem chcesz zwrócić wartość ze słownika jeśli jej klucz == podany przez użytkownika name. W takim razie wystarczy:
result = dictionary.get(user_input, 'not found')
ta linijka przypisze Ci wartość odszukanego klucza lub string ‘not found’ jeśli taki klucz nie istnieje w słowniku
Mam nadzieję że ogarniasz angielski, bo w tej branży większość wartościowych tekstów jest w tym języku. Spójrz np na to
https://www.laurentluce.com/posts/python-dictionary-implementation/
Na sam początek wystarczy sekcja hash tables.
Trzeba w nim rozbudzić ciekawość i umiejętność drążenia tematu na podstawie kilku słów kluczowych. Wskazywać co już dobrze wykminił, a co jest jeszcze do poprawy. I nie dawać przy tym rozwiązań na tacy
No i jak najszybciej korygować złe nawyki. A takim jest dla mnie wynajdywanie na nowo czegoś, co już jest w danym języku/bibliotece standardowej