我有40.000个ID,这是字典中的键。我需要以random.shuffle为例来改组它们。但我可以跳过这一步吗?
Dictionary不会按照它们的顺序存储键,所以如果我keys = dict.keys()
,那么keys
包含非升序的键。我的程序只会运行一次,所以我不在乎执行中的“排列结果”是否相同。
那么,我可以“欺骗”并跳过洗牌步骤吗?
据我所知,键的顺序有点可预测。我问的是这个:
random.shuffle()
生成的排列与键的顺序(很多)相同的概率(粗略地说)是多少?
答案 0 :(得分:2)
不,你不能。
如果您需要随机性,则无法在输入字典中的数据之前或之后跳过改组。
原因是虽然字典中的键顺序不能得到保证,但是根据输入顺序,他们将假设的顺序具有很强的可预测性。
字典中的条目是根据键的hash
的值来完成的,键的值非常大,以另一个大数为模,创建一个有界的值范围。当两个键散列到相同的值时,会出现collision
;然后将密钥放在下一个可用位置(以确定的方式)
[编辑]:
以与哈希桶大致(大致)相同的顺序随机获取密钥的机会是......不确定。
答案 1 :(得分:2)
详细说明其他人在说什么以及为什么你真的需要洗牌。如果以相同的方式重复初始化字典,则每次都会有相同的顺序。这显然不是随意的。正如Masque所说,它基于哈希(参见SO问题Why is the order in dictionaries and sets arbitrary?)。
回答" random.shuffle()生成的排列与键的顺序(很多)相同的概率(粗略地说)是多少?"直接:与1/factorial(len(yourDict))
;这是因为其中一个排列将导致与dict在初始化时所做的顺序相同。但是,所有其他排序都会有所不同,并且可能会因改组而导致factorial(len(yourDict))
个不同的排列(排序)。
希望有所帮助!