Порядок элементов set-ов в Python

Проверьте себя, предположите, что выведет print?

list_1 = list(set([u'external_new', u'external', u'app_store']))
list_2 = list(set([u'app_store', u'external', u'external_new']))
print list_1 == list_2

А теперь проверьте себя еще раз

list_1 = list(set([u'external_new', u'external', u'app_store'] + range(100)))
list_2 = list(set([u'app_store', u'external', u'external_new'] + range(100)))
print list_1 == list_2

На самом деле, такое поведение очевидно, достаточно вспомнить, что внутри cPython set – хеш-таблица с открытой адресацией. Если количество элементов set-а приближается к количеству элементов внутреннего массива хеш-таблицы, вероятность коллизий повышается. В случае появления коллизий, преобразование set-а в список будет выдавать элементы коллизий в той последовательности, в которой эти элементы были добавлены в set.

Leave a Reply

Your email address will not be published. Required fields are marked *