擅长:python、mysql、java
<p>我在这里假设一个值<code>0</code>意味着永远不应该选择这个键,这些键可能会在示例中重复(在字典中是不相关的),在这种情况下,我们可以使用第三方模块numpy。这是在python3.6.4中测试的代码,但是我修改了它,使它在python2.7中运行,但是我不能用这种方式测试它。在</p>
<pre><code>DICT_VAR= {'best':308281009, 'good':7066325, 'meh':26884, 'bad':71,
'terrible':16, 'never':0}
import numpy as np
keys, weights = zip(*DICT_VAR.items())
probs = np.array(weights, dtype=float) / float(sum(weights))
sample_np = np.random.choice(keys, 2, p=probs)
sample = [str(val) for val in sample_np]
</code></pre>
<p>然后<code>sample</code>将示例保存为一个键字符串列表。注意,键<code>'best'</code>的权重比其他权重大得多,因此样本几乎总是<code>['best', 'best']</code>。在</p>
<p>解释我的代码:首先将字典的键(字符串)和值(权重)拆分成单独的列表。然后把权重改为概率,权重越大,概率越大,权重越小,概率越小。然后使用numpy的<code>choice</code>函数选择一个使用概率作为权重的密钥样本。结果是一个numpy数组,但是您似乎想要一个标准的Python列表,因此最后一行将键的示例转换为标准列表。在</p>
<p>当然,有一个相当短的例程可以用标准Python编写,因此我们可以避免使用numpy。但很可能会慢一些。在</p>
<p>你的例程慢的原因是它建立了一个大的列表,每个键重复其值给定的次数,然后以均匀的概率选择一个样本。对于示例数据,这意味着要构建一个比可用RAM大得多的庞大列表,这需要花费大量时间。Numpy的choice例程可以直接处理非均匀随机分布,而无需构建另一个列表。在</p>