按值的权重对字典进行加权洗牌
Weighted shuffle of dictionary by weight of value
我有一本字典,其中的元素作为键进行排序,它们的权重/概率作为值。
我想得到一个排序的键列表,使用这些值作为下一个选择元素的概率。
示例:
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 key为x[0]
,dict value为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]
我有一本字典,其中的元素作为键进行排序,它们的权重/概率作为值。
我想得到一个排序的键列表,使用这些值作为下一个选择元素的概率。
示例:
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 key为x[0]
,dict value为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]