2010-05-18 6 views
12

Я хотел бы знать, является ли отсутствие упорядочения элементов структуры встроенного в Python структуры set «случайным образом». Например, взяв итератор множества, можно ли считать его перетасованным взглядом на его элементы?Можно ли считать отсутствие заказа Python случайным порядком?

(если это имеет значение, я бегу Python 2.6.5 на хосте Windows.)

ответ

25

Нет, это не случайным. Он «произвольно упорядочен», что означает, что вы не можете зависеть от того, что он либо упорядочен, либо случайен.

+3

Важно понимать разницу между «неопределенным» и «случайный». –

+7

Действительно, порядок предсказуем из идентификаторов различных объектов в наборе. Код довольно строго определен кодом. НО - бонус - детали не относятся к вашему бизнесу, делая их «произвольными» и «специфичными для реализации» и «не зависимыми ни для чего». И «undefined, насколько вам разрешено заботиться». –

+0

OK. Хеш-функция определит порядок. Например, для целых элементов мы получим естественный порядок. Итак, я заключаю, что у нас будет «неопределенное», «произвольное» и «повторяемое» упорядочение для одного и того же набора элементов. – Chuim

4

Нет, вы не можете положиться на это для какой-либо реальной статистической цели. Реализация наборов в Python относится к хеш-таблице и может привести к тому, что распределение элементов отображает некоторые очень неслучайные свойства. Между «не имеющим гарантированного порядка» и «гарантированно неупорядоченным в равномерном случайном порядке» существует большой разрыв.

Использование random.shuffle по действительно перемешать элементы последовательности.

+0

Вещь 'random.shuffle' может использоваться только для последовательностей, которые' set' не являются. Можно преобразовать его в «список», но для большого количества элементов и кода, чувствительного к производительности, это может быть проблемой ... – Chuim

3

Одним словом, нет:

>>> list(set(range(10000))) == list(range(10000)) 
True 
+0

Согласен, просто сделал аналогичные тесты сам и получил эти результаты. – Chuim

4

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

Это не случайно, это только свобода. Если это лучше, то порядок может быть отправлен по средам и «назад» по пятницам.

+0

Наверх "Zen" ответ! ;) – Chuim

0

Просто примечание о строгом порядке. Похоже, что он очень ненадежный даже в одной и той же среде.

Например, этот код дает разные ответы:

data = 'KSRNDOW3GQ' 
chars = set(data) 
print(list(chars)) 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^