这是python文档中关于如何生成随机序列的一小段代码,即当每个序列都有权重关联时选择一种颜色。
我理解这个概念,但是当我试图自己做的时候,无法弄清楚列表理解是做什么的。有人可以迭代地解释这个列表理解是做什么的,这样我就能更好地理解这段代码。感谢。
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'
答案 0 :(得分:2)
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]
这个简单的列表理解是这样做的:
这会产生:
['Red','Blue','Yellow''Green']
现在让我们看看第二部分让我们先做一个简单的列表理解
second_part = ['Red' for i in range(3)]
列表理解的第二部分是这样做的:
这会产生:
['Red','Red','Red']
结合两种理解:
population = [val for val, cnt in weighted_choices for i in range(cnt)]
这个简单的列表理解是这样做的:
这会产生:
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
答案 1 :(得分:1)
将其视为for
循环,如下所示:
population = []
for val, cnt in weighted_choices:
for i in range(cnt):
population.append(val)
从weighted_choices
开始,它遍历每个项目,为您提供如下内容:
('Red', 3)
从那里开始,它会遍历一个长度范围cnt
(3,此处),并多次将val
(红色)追加到population
。所以最后你会得到:
['Red',
'Red',
'Red',
'Blue',
'Blue',
'Yellow',
'Green',
'Green',
'Green',
'Green']
您可以看到其中包含Red
三次,Blue
两次,Yellow
一次和Green
四次,这反映了初始中每种颜色旁边的数字名单。
当我查看那些双重嵌套的列表推导时,我只想到一个像上面那样的for
循环,然后将其“压扁”在我脑海中,这样它就在一条线上。不是最先进的方式,但它有助于我保持直线:)
答案 2 :(得分:1)
最好扩展列表理解以对其进行分析:
population = []
for val, cnt in weighted_choices:
for i in range(cnt):
population.append(val)
这将weighted_choices
扩展为元素列表,其中每个项目根据其权重重复; Red
添加3次,Blue
2次,等等:
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
然后random.choice()
函数随机选取其中一个元素,但Green
出现4次,因此被选中的可能性高于Yellow
,只有一次在扩展列表中。
答案 3 :(得分:0)
列表理解包括2个for循环。
尝试使用print
代替
for val, cnt in weighted_choices:
# the first for loop will be executed len(weighted_choices) times = 4
for i in range(cnt):
# the second for loop will be executed cnt times
# for each execution of the outer loop
# (cnt = second element of each tuple)
print val # it will print each first element of the tuple 'Red', ...
# len(weighted_choices) * cnt times
现在,代码print
代替val
将{{1}}添加到名为population的列表中。
其余的都是微不足道的,代码使用列表作为输入随机选择。