字典的键的顺序是否可以被看作是随机排列?

2024-04-28 13:31:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有4万个身份证是字典里的钥匙。我需要洗牌,例如random.shuffle。但我能跳过这一步吗?在

Dictionary并没有按照键的出现顺序来存储键,所以如果我按keys = dict.keys()的顺序存储,那么{}将以非升序的顺序包含这些键。我的程序只运行一次,所以我不关心“置换结果”在执行中是否相同。在

那么,我能“作弊”并跳过洗牌步骤吗?在


我知道钥匙的顺序是可以预测的。但我要问的是:

random.shuffle()生成的排列与键的顺序(大体上)相同的几率是多少?


Tags: 程序dictionary字典顺序步骤randomkeysdict
2条回答

详细说明其他人在说什么,以及你为什么需要洗牌。如果你以同样的方式重复初始化你的字典,那么每次的顺序都是一样的。这显然不是随机的。正如Masque所说,它是基于hash的(参见下面的SO问题Why is the order in dictionaries and sets arbitrary?)。在

回答“由随机洗牌()与钥匙的顺序完全相同?”直接:它与洗牌完全相同的几率是1/factorial(len(yourDict));这是因为其中一个置换将导致与初始化时dict相同的顺序。所有其他的顺序都是不同的,并且有factorial(len(yourDict))不同的排列(顺序)可能是由于洗牌而产生的。在

希望有帮助!在

不,你不能

如果需要随机性,则不能在将数据输入字典之前或之后跳过洗牌。在

原因是,尽管不能保证字典中键的顺序,但是它们根据条目顺序所采用的顺序具有很强的可预测性。在

字典中的条目是根据键的hash的值来完成的,这是一个非常大的数,将另一个大数模化,从而创建一个有界的值范围。当两个键散列到同一个值时,collision发生;然后将该键放在下一个可用的位置(以确定的方式为准)

[编辑]:
以与哈希桶大致相同的顺序随机获取密钥的机会是。。。不确定。在

相关问题 更多 >