Python 有人能解释一下下面的清单吗
这是python文档中的一段简单代码,介绍了如何生成随机序列,即在每个序列都有相关权重时选择颜色 我理解这个概念,但是当我试图自己做的时候,我不知道列表理解在做什么。有人可以反复解释一下这个列表理解在做什么,这样我就可以更好地理解这段代码了。谢谢Python 有人能解释一下下面的清单吗,python,list,list-comprehension,Python,List,List Comprehension,这是python文档中的一段简单代码,介绍了如何生成随机序列,即在每个序列都有相关权重时选择颜色 我理解这个概念,但是当我试图自己做的时候,我不知道列表理解在做什么。有人可以反复解释一下这个列表理解在做什么,这样我就可以更好地理解这段代码了。谢谢 weighted_choices = [('Red', 3), ('Blue', 2), ('Yellow', 1), ('Green', 4)] population = [val for val, cnt in weighted_choices f
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'
将其视为一个类似以下内容的
for
循环:
population = []
for val, cnt in weighted_choices:
for i in range(cnt):
population.append(val)
从加权_选项开始
,它迭代每个项目,为您提供如下内容:
('Red', 3)
从这里开始,它在一个长度范围内迭代cnt
(3,这里)并将val
(红色)添加到总体
。因此,在最后你会得到:
['Red',
'Red',
'Red',
'Blue',
'Blue',
'Yellow',
'Green',
'Green',
'Green',
'Green']
如您所见,它包含红色
三次、蓝色
两次、黄色
一次和绿色
四次,反映了初始列表中每种颜色旁边的数字
当我看到像这样双重嵌套的列表理解时,我只想到一个类似于上面的
for
循环,然后在我的脑海中“挤压”它,使它全部在一行上。这不是最先进的方法,但它可以帮助我保持直截了当:)最好扩展列表理解来分析它:
population = []
for val, cnt in weighted_choices:
for i in range(cnt):
population.append(val)
这将weighted_选项
扩展为元素列表,其中每个项目根据其权重重复<代码>红色添加3次,蓝色添加2次,以此类推:
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
然后,
random.choice()
函数随机选取这些元素中的一个,但是绿色
出现4次,因此被选中的几率要高于,比如说黄色
,黄色在扩展列表中只出现一次。列表理解由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
现在,您的代码将val
添加到名为population的列表中,而不是print
。
其余的都很简单,代码使用列表作为输入进行随机选择
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]
这个简单的列表理解就是这样做的:
- 对于加权_选项中的每个项目,将第一部分打断并将其分配给val,第二部分分配给cnt
- 获取val并从每个val中创建一个新数组
['Red','Blue','Yellow''Green']
['Red','Red','Red']
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
现在让我们看第二部分,首先让我们做一个简单的列表
second_part = ['Red' for i in range(3)]
清单的第二部分是这样做的:
- 对于范围(3)中的每个i(数字[0,1,2])
- 丢弃i并将“红色”添加到列表中
['Red','Blue','Yellow''Green']
['Red','Red','Red']
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
结合两种理解:
population = [val for val, cnt in weighted_choices for i in range(cnt)]
这个简单的列表理解就是这样做的:
- 对于加权_选项中的每个项目,将第一部分打断并将其分配给val,第二部分分配给cnt。(例如第一项为“红色”和3)
- 拿着val和
- 对于范围内的每个i(cnt)(如果cnt为3,则数字[0,1,2])丢弃i并将val添加到列表中
['Red','Blue','Yellow''Green']
['Red','Red','Red']
['Red', 'Red', 'Red', 'Blue', 'Blue', 'Yellow', 'Green', 'Green', 'Green', 'Green']
嵌套列表理解的经验法则:按循环在理解中出现的顺序展开for循环。注意,我认为这不是进行加权随机选择的好方法。