我有一个字典,其中有要排序的元素作为键,它们的权重/概率作为值。
我想获得一个排序列表的键使用的值作为概率是下一个选择的元素。
的例子:
l = {6: 5859, 7: 61636, 2: 53317}
# Example output 1
output1 = [7,2,6]
# Example output 2
output2 = [2,7,6]
我研究了一下,发现排序函数重新定义了它,并将random()与权重本身相乘,但我没有得到运行的语法。所以我的伪代码Python的解决方案是:
from random import random
l.sort(key = lambda element: random() * element.value())
当然,字典没有排序函数,element.value()也不能工作,但我认为这是它可以用更好的语法工作的方式。
还是有更好的解决方案?
如果你想排序一个不是列表的可迭代对象,要么先将其转换为列表,要么直接调用sorted
例如,如果d
是dict
,那么您可以使用以下命令对其键进行排序:
a = sorted(d.keys())
;或a = list(d); a.sort()
.
因为键和值都需要,所以应该在d.items()
上工作,而不是在d.keys()
上。然后,如果传递给sorted
的key
函数定义为lambda x: ...
,则可以将dict键引用为x[0]
,将dict值引用为x[1]
。
我似乎明白,更高的权重应该增加数字优先出现的可能性。在这种情况下,您应该使用sorted
的可选参数reverse=True
,以降序排序,而不是以递增顺序排序。
记住这些,修改你的代码:
import random
d = {6: 5859, 7: 61636, 2: 53317}
a = [k for k,v in sorted(d.items(), key=lambda x: random.uniform(0, x[1]), reverse=True)]
print(a)
# [7, 2, 6]