2014-01-04 3 views
1

У меня есть вопрос о ненаправленности наборов.Python: устанавливает и set.intersection - случайный порядок вывода?

Этот код:

#Set1 is 'a' to 'e' in alpha order 
set1 = {} 
set1 = {'a', 'b', 'c', 'd', 'e'} 
print('\nSet1 :', set1) 

#Set2 is 'f' to 'a' (missing 'e') in reverse-alpha order 
set2 = {} 
set2 = {'f', 'd', 'c', 'b', 'a'} 
print ('Set2 :', set2) 

print ('Common to both sets:', set1.intersection(set2)) 

... дает случайное упорядочение элементов в set1, set2 и в результате set.intersection:

Set : {'a', 'c', 'b', 'e', 'd'} 
Set: {'a', 'c', 'b', 'd', 'f'} 
Common to both sets: {'a', 'c', 'b', 'd'} 

Хотя не проблема сама по себе, на мой вопрос это: существует ли для этого набор алгоритмов? Или я могу (по возможности) использовать это свойство для генерации случайных списков элементов, представленных в двух списках (т. Е. Действительно ли это случайным?). Кстати, я понятия не имею, почему я, возможно, захочу сделать это, подумав вслух.

+0

Наборы не упорядочены. Вы не можете полагаться на элементы в наборах, имеющих какой-либо конкретный порядок, и вы не можете полагаться на них как «случайные». – BrenBarn

+0

@BrenBarn Помимо удаления дубликатов, их использование должно быть довольно эзотерическим. Я буду придерживаться списков и кортежей, пока я еще на первой неделе обучения Python. Спасибо за ответ. –

+0

@ShaneMHewitt Нет, не эзотерический вообще. Хотя списки и кортежи более распространены, я часто сталкиваюсь с данными, которые не имеют значимого порядка и не нужно принуждать в каком-то порядке к работе моего кода. – delnan

ответ

1

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

>>>> sorted(set1.intersection(set2)) 
{'a', 'b', 'c', 'd'} 
+1

Не только на их хэш, также на размер контейнера и его историю вложений и удалений, а иногда и на случайное семя. – delnan

+0

@ delnan - Я знаю, что это было больше, чем просто хэш, но я не знал о случайном семени. Какая цель это служит? – MattDMo

+0

Я должен упомянуть для полноты, что он влияет на хэши строк и т. П., А не на hashables как таковые, он технически уже включен в «хэш их содержимого». Что касается цели: он предназначен для предотвращения атак DOS-атак (отправляйте специально созданные запросы, которые заставляют сервер строить хеш-таблицу с многочисленными коллизиями). Некоторые люди (я считаю, что tem, но не все на python-dev, похоже, согласны) говорят, что тривиально адаптировать эти атаки, чтобы обойти семя. – delnan

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