按值的权重对字典进行加权洗牌



我有一个字典,其中有要排序的元素作为键,它们的权重/概率作为值。

我想获得一个排序列表的键使用的值作为概率是下一个选择的元素。

的例子:

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

例如,如果ddict,那么您可以使用以下命令对其键进行排序:

  • a = sorted(d.keys());或
  • a = list(d); a.sort().

因为键和值都需要,所以应该在d.items()上工作,而不是在d.keys()上。然后,如果传递给sortedkey函数定义为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]

相关内容

  • 没有找到相关文章

最新更新