weighted_choices = [('Red', 3), ('Blue', 2), ('Yellow', 1), ('Green', 4)]
population = [val for val, cnt in weighted_choices for i in range(cnt)]
random.choice(population)
'Green'
让我们从简单的理解开始
simple = [val for val, cnt in weighted_choices]
这个简单的列表理解是这样做的:
- 对于 weighted_choices 中的每个项目,打破第一部分并将其分配给 val,将第二部分分配给 cnt。
- 取出 val 并从每个 val 中创建一个新数组
这将产生:
['Red','Blue','Yellow''Green']
现在让我们看看第二部分让我们先做一个简单的列表理解
second_part = ['Red' for i in range(3)]
列表理解的第二部分是这样做的:
- 对于 range(3) 中的每个 i(数字 [0,1,2])
- 丢弃 i 并将“红色”添加到列表中
这将产生:
['Red','Red','Red']
结合两种理解:
population = [val for val, cnt in weighted_choices for i in range(cnt)]
这个简单的列表理解是这样做的:
- 对于 weighted_choices 中的每个项目,打破第一部分并将其分配给 val,将第二部分分配给 cnt。(例如“红色”和第一项为 3)
- 取 val 和
- 对于 range(cnt) 中的每个 i(如果 cnt 为 3,则数字 [0,1,2])丢弃 i 并将 val 添加到列表中
这将产生:
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']