Czy Słownik Pythona jest przykładem tabeli hash?
Jedną z podstawowych struktur danych w Pythonie jest słownik, który pozwala zapisywać "Klucze "do wyszukiwania" wartości " dowolnego typu. Czy jest to zaimplementowane wewnętrznie jako tabela hash? Jeśli nie, to co?
4 answers
Tak, jest to mapowanie hash lub tabela hash. Opis implementacji Pythona dict napisany przez Tima Petersa, znajduje się tutaj .
Dlatego nie możesz użyć czegoś 'nie hashowalnego' jako klucza dict, np. listy:
>>> a = {}
>>> b = ['some', 'list']
>>> hash(b)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
>>> a[b] = 'some'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list objects are unhashable
Możesz przeczytać więcej o tablicach hashowych lub sprawdzić jak zostało zaimplementowane w Pythonie i dlaczego jest zaimplementowane w ten sposób .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 03:13:43
W słowniku Pythona musi być coś więcej niż wyszukiwanie tabeli w hash (). Przez brutalne eksperymenty znalazłem ten hash :
>>> hash(1.1)
2040142438
>>> hash(4504.1)
2040142438
Jednak nie łamie słownika:
>>> d = { 1.1: 'a', 4504.1: 'b' }
>>> d[1.1]
'a'
>>> d[4504.1]
'b'
Sprawdzenie stanu zdrowia psychicznego:
>>> for k,v in d.items(): print(hash(k))
2040142438
2040142438
Być może istnieje inny poziom Wyszukiwania poza hash (), który pozwala uniknąć kolizji między kluczami słownikowymi. A może dict () używa innego hasha.
(przy okazji, to w Pythonie 2.7.10. Ta sama historia w Pythonie 3.4.3 i 3.5.0 z kolizją na hash(1.1) == hash(214748749.8)
.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-01 04:01:49
Tak. Wewnętrznie jest zaimplementowany jako otwarte hashowanie oparte na prymitywnym wielomianie nad Z/2 (source).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-12 18:56:55
Aby rozwinąć Wyjaśnienie nosklo:
a = {}
b = ['some', 'list']
a[b] = 'some' # this won't work
a[tuple(b)] = 'some' # this will, same as a['some', 'list']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-22 15:09:43