yigal_s: (Default)
[personal profile] yigal_s
s = set()

for i in range(0,10) :
s.add('s'+str(i))
s.add(i)
for i in s :
print(i)

Тестовая программка на питоне. Можно её даже онлайн погонять: https://onlinegdb.com/ByVgsweQ_

При каждом прогоне выдаёт разную последовательность строк. При этом целые значения упорядочены от 0 до 9 (!), а между ними в случайном порядке (!!), всякий раз разном (!!!) располагаются строковые значения. Откровенно говоря, я даже не знаю, какой из этих трёх фактов выглядит более странным.

Вроде везде пишут, что Сеты в Питоне сделаны на хешах.

Как, как им всё это удалось сделать одновременно???

UPD: со строками вроде разобрался - их хеш в Пайтоне рандомизирован (борются с хаккерами).
При случайном закидывании последовательных целых, они оказываются в set упорядоченными, и это как-то мне всё же не нравится.
Осталось разобраться с целыми.

Date: 2021-03-06 03:48 am (UTC)
From: [identity profile] occuserpens.livejournal.com
А питонские иденты Пушкин соблюдать будет? :)

# just because sets are unordered 
s = set()

for i in range(0,10):
    s.add('s'+str(i))
print (s)
Edited Date: 2021-03-06 04:27 am (UTC)

Date: 2021-03-06 04:26 am (UTC)
From: [identity profile] occuserpens.livejournal.com
# same crap
s = []
for i in range(0,10):
    s.append('s'+str(i))
print (s)
ss = {*s}
print (ss)

Date: 2021-03-06 10:24 am (UTC)
From: [identity profile] ak-47.livejournal.com
Если так невтерпёж разобраться, то можно посмотреть в сорцах. :)

Set по определению не гарантирует упорядоченности элементов. Поэтому надо наоборот спасибо сказать что пайтоновская имплементация забесплатно ещё и такие баги отловит.
Edited Date: 2021-03-06 10:32 am (UTC)

Date: 2021-03-06 09:41 pm (UTC)
From: [identity profile] ak-47.livejournal.com
Я имел в виду распространённый баг когда люди вынимают элементы из set/map и ожидают их в определённом порядке. Иногда это может указывать на то, что применён неправильный контейнер. Либо менее очевидные последствия, когда от порядка элементов могут быть разные результаты вычисления.

На память приходит известный баг химиков, который похерил кучу фундаментальных работ. (Там не учли порядок сортировки на файловой системе в разных ОС.)

Date: 2021-03-07 04:10 am (UTC)
From: [identity profile] ak-47.livejournal.com
Ну да, внутри они упорядоченные. Но, по-моему, закладываться на это не стоит. Я всегда концептуально воспринимаю set/map как неупорядоченные и не пишу код, который бы на это полагался.