Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从字典中获取随机对象(按值加权)_Python_Performance_Dictionary_Random_Big O - Fatal编程技术网

Python 如何从字典中获取随机对象(按值加权)

Python 如何从字典中获取随机对象(按值加权),python,performance,dictionary,random,big-o,Python,Performance,Dictionary,Random,Big O,我有一本大字典。键是对象,值是给定对象在“我的数据”中出现的频率 我想从字典中随机选择一个对象,但要将选择权加权到对应值较高的对象 到目前为止,我已经能够通过向列表中添加x个对象来实现这一点,其中x是字典中相应的值。然后我在这个列表中调用random.choice。像这样: import random myDict = { 'foo' : 10, 'boo' : 5, 'moo' : 3, 'roo' : 2,

我有一本大字典。键是对象,值是给定对象在“我的数据”中出现的频率

我想从字典中随机选择一个对象,但要将选择权加权到对应值较高的对象

到目前为止,我已经能够通过向列表中添加x个对象来实现这一点,其中x是字典中相应的值。然后我在这个列表中调用random.choice。像这样:

import random

myDict = { 'foo' : 10,
           'boo' : 5,
           'moo' : 3,
           'roo' : 2,
           'goo' : 1,
           'oo' : 0}

selection = []
for obj in myDict.keys():
    for n in range(myDict[obj]):
        selection.append(obj)
为了确保这是有效的,我在列表上运行了10000次random.choice并保存了结果。以下是我得到的4个结果

{'foo': 4841, 'boo': 2397, 'moo': 1391, 'roo': 907, 'goo': 464, 'oo': 0}
{'foo': 4771, 'boo': 2410, 'moo': 1435, 'roo': 917, 'goo': 467, 'oo': 0}
{'foo': 4815, 'boo': 2340, 'moo': 1431, 'roo': 953, 'goo': 461, 'oo': 0}
{'foo': 4718, 'boo': 2443, 'moo': 1404, 'roo': 947, 'goo': 488, 'oo': 0}
如您所见,分布符合字典中描述的频率

我的问题是,在我的生产代码中,我有数千个字典,每个字典包含数千个对象。这些词典长度可变。我目前的方法效率很低,速度也很慢。有更好的办法吗?我不介意使用不同的结构来存储数据。

numpy提供了一个可选的概率参数,可以解决您的问题:

In [14]: s = sum(myDict.values())

In [15]: d2 = {k: v/float(s) for k, v in myDict.items()}

In [16]: res = np.random.choice(list(d2.keys()), 10000, p=list(d2.values()))

In [17]: from collections import Counter

In [18]: Counter(res)
Out[18]: Counter({'foo': 4723, 'moo': 1426, 'boo': 2411, 'roo': 945, 'goo': 495})

这有用吗:?这是个骗局。基本上你想使用随机选择你的_键。。并为其提供权重:请看——总体是您的关键,权重取自您的值。。。。