有时候我的套装是有序的,有时候不是(Python)

时间:2014-04-17 01:21:44

标签: python random set

所以我知道一个集合应该是一个无序列表。我正在尝试对自己做一些编码,结果发生了一些奇怪的事情。我的设置有时会从1到100(当使用更大的数字时)按顺序排列,当我使用较小的数字时,它将保持无序。那是为什么?

#Steps:
#1) Take a number value for total random numbers in 1-100
#2) Put those numbers into a set (which will remove duplicates)
#3) Print that set and the total number of random numbers

import random

randomnums = 0

Min = int(1)
Max = int(100)
print('How many random numbers would you like?')
numsneeded = int(input('Please enter a number.            '))
print("\n" * 25)

s = set()

while (randomnums < numsneeded):
    number = random.randint(Min, Max)
    s.add(number)
    randomnums = randomnums + 1

print s
print len(s)

如果有人对清理我的代码有任何指示,我100%愿意学习。谢谢你的时间!

2 个答案:

答案 0 :(得分:5)

set的文档说明为an unordered collection时,它只表示您对该集合的元素没有特定的顺序。集合可以选择用于保存数据的内部表示,当您要求元素时,它们可能会以任何顺序返回。在某些情况下对它们进行排序的事实可能意味着该集合已选择以排序的方式存储元素。

该集合可以根据诸如集合中元素的数量等因素在性能和空间之间做出权衡决策。例如,它可以在列表中存储小集,但在树中存储较大的集。从树中检索元素的最自然方式是按排序顺序排列,这就是你可能会发生的事情。

有关此内容的详情,请参阅Can Python's set absence of ordering be considered random order?

答案 1 :(得分:0)

使用哈希实现实现集合。整数的哈希就是整数。要确定将数字放在表中的何处,使用除以表大小的整数的余数。该表以8的大小开始,因此数字0到7将按顺序放置在它们自己的插槽中,但是8将放在0插槽中。如果将数字1到4和8添加到空集中,它将显示为:

set([8,1,2,3,4])

添加5时会发生的情况是表格已超过2 / 3rds。此时,表的大小增加到32.创建新表时,现有表将重新填充到新表中。现在它显示为:

set([1,2,3,4,5,8])

在您的示例中,只要您添加了足够的条目以使表格具有128个条目,那么它们将按顺序放置在各自的分箱中。如果您只添加了足够多的条目,表格中有32个广告位,但您使用的数字最多为100个,那么这些项目肯定不会有序。