[Python] Wyszukiwanie w slownikach

Hej Wonsy, ogarnia ktos wyszukiwanie w slownikach w Pythonie? Mam maly problem i nie wiem jak go ugryzc :frowning:

1 polubienie

Opisz problem, na pewno ktoś pomoże.

3 polubienia

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.

1 polubienie

Dzieki Maciej za wyjasnienie​:grin::+1:

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? :wink: 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 :wink:

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.

1 polubienie

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 :wink:
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