4

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

4 回答 4

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)]

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

  • 对于 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']
于 2013-01-22T22:59:57.833 回答
1

把它想象成一个for看起来像这样的循环:

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

从 开始weighted_choices,它遍历每个项目,为您提供如下内容:

('Red', 3)

从那里,它遍历一个长度范围(3,这里)并将(红色)cnt附加到该长度范围内多次。所以最后你得到:valpopulation

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

如您所见,其中包含Red3 次、2Blue次、 1Yellow次和Green4 次,这反映了初始列表中每种颜色旁边的数字。

当我看到像这样双重嵌套的列表推导时,我只想到一个for像上面那样的循环,然后在我的脑海中“压扁”它,这样它就在一行上。不是最先进的方法,但它可以帮助我保持直截了当:)

于 2013-01-22T22:38:12.267 回答
1

最好扩展列表理解来分析它:

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

这扩展weighted_choices为一个元素列表,其中每个项目根据其权重重复;Red添加3次,Blue2次等:

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

然后,该random.choice()函数随机获取其中一个元素,但Green出现 4 次,因此被选中的机会高于 ,例如Yellow,后者在扩展列表中仅出现一次。

于 2013-01-22T22:39:06.890 回答
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到名为 population 的列表中。其余的很简单,代码使用列表作为输入进行随机选择。

于 2013-01-22T22:43:59.253 回答