有人可以解释下面的列表理解

时间:2013-01-22 22:35:56

标签: python list list-comprehension

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

4 个答案:

答案 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]

这个简单的列表理解是这样做的:

  • 对于weighted_choices中的每一项都会破坏第一部分并将其分配给val,将第二部分分配给cnt。
  • 取val并从每个val中创建一个新数组

这会产生:

['Red','Blue','Yellow''Green']

现在让我们看看第二部分让我们先做一个简单的列表理解

second_part = ['Red' for i in range(3)]

列表理解的第二部分是这样做的:

  • 对于范围内的每个i(3)(数字[0,1,2])
  • 弃掉我并在列表中添加“红色”

这会产生:

['Red','Red','Red']

结合两种理解:

population = [val for val, cnt in weighted_choices for i in range(cnt)]

这个简单的列表理解是这样做的:

  • 对于weighted_choices中的每个项目,打破第一部分并将其分配给val,将第二部分分配给cnt。 (例如'红色'和第一个项目的3个)
  • 拿val和
  • 对于范围内的每个i(cnt)(如果cnt为3,则为数字[0,1,2])丢弃i并将val添加到列表中

这会产生:

['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的列表中。 其余的都是微不足道的,代码使用列表作为输入随机选择。