我想从给定的字典中创建3个选项的样本。字典长度可以变化。
我在之前的代码中所做的是创建一个加权值字典,在这种情况下是12个值和键。
无法从random.choice中检索样本。
使用python 3
我的字典是
dictionary = {'Three': 14.4, 'Five': 11.2, 'Two': 14.4, 'Thirteen': 3.3, 'One': 17.6, 'Seven': 3.3, 'Nine': 3.3, 'Ten': 3.3, 'Twelve': 3.3, 'Eight': 3.3, 'Four': 12.0, 'Six': 10.4}
我尝试从随机选择的字典中检索3个样本。
my_sample = random.sample(random.choice(dictionary), 3)
print(my_sample)
但是得到这个错误
Traceback (most recent call last):
File "c_weights.py", line 38, in <module>
my_sample = random.sample(random.choice(dictionary), 3)
File "/usr/lib64/python3.3/random.py", line 252, in choice
return seq[i]
KeyError: 11
试图获得
My_sample =('One','Four','Twelve')例如。
编辑: 只是要清楚我正在努力的是。
('One', 'Four','Twelve')
('Two', 'One','Six')
('Four', 'Two','Five')
('One', 'Eight','Two')
('Thirteen', 'Three','Six')
所以独特的集合建立在字典内的加权概率(或者如果更好的话是元组)
答案 0 :(得分:2)
您无法成功将random.choice()
应用于字典 - 它是序列的函数,而不是映射。
尝试:
random.sample(dictionary, 3)
返回包含来自dict的3个随机密钥的列表。
答案 1 :(得分:1)
好吧这可能充满了错误/统计错误,但它是你的起点,我现在没有更多的时间。这也是非常低效的!话虽如此,我希望它有所帮助:
import random
d= {'Three': 14.4, 'Five': 11.2, 'Two': 14.4, 'Thirteen': 3.3, 'One': 17.6, 'Seven': 3.3, 'Nine': 3.3, 'Ten': 3.3, 'Twelve': 3.3, 'Eight': 3.3, 'Four': 12.0, 'Six': 10.4}
total_weight = sum(d.values())
n_items = 3
random_sample = list()
d_mod = dict(d)
for i in range(n_items):
random_cumulative_weight = random.uniform(0, total_weight)
this_sum = 0.0
for item, weight in d_mod.items():
this_sum += weight
if this_sum >= random_cumulative_weight:
random_sample.append(item)
break
del(d_mod[item])
total_weight -= this_sum
random_sample
产生['七','九','二'等等。