字典键的顺序可以被认为是随机排列吗?

时间:2016-05-06 01:45:42

标签: python dictionary key shuffle

我有40.000个ID,这是字典中的键。我需要以random.shuffle为例来改组它们。但我可以跳过这一步吗?

Dictionary不会按照它们的顺序存储键,所以如果我keys = dict.keys(),那么keys包含非升序的键。我的程序只会运行一次,所以我不在乎执行中的“排列结果”是否相同。

那么,我可以“欺骗”并跳过洗牌步骤吗?

据我所知,键的顺序有点可预测。我问的是这个:

random.shuffle()生成的排列与键的顺序(很多)相同的概率(粗略地说)是多少?

2 个答案:

答案 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))个不同的排列(排序)。

希望有所帮助!