Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有人能解释一下下面的清单吗_Python_List_List Comprehension - Fatal编程技术网

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

这是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'

将其视为一个类似以下内容的
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循环。注意,我认为这不是进行加权随机选择的好方法。