[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