首页 > 解决方案 > 如何在列表理解中执行多项操作

问题描述

L = [random.randint(0,50) for i in range(5) random.randint(0,12) for i in range(2)]

如何让它在 (0,50) 之间选择 5 个随机数,然后在 (0,12) 之间选择 2 个随机数?

标签: pythonlistoperation

解决方案


您可以根据randint()的值将第二个参数更改为i

[randint(0, 50 if i < 5 else 12) for i in range(7)]

该表达式将更改最后两次迭代50 if i < 5 else 12传递给的内容。random.randint()

您可以拼写出更多变体。列表推导式是一堆循环和if过滤器,它们重复执行前面的表达式。有很多方法可以根据表达式中的迭代值来拼写改变函数调用的参数

例如,您可以将这些参数记录在functools.partial()objects中:

from functools import partial
from random import randint

rint50 = partial(randint, 0, 50)
rint12 = partial(randint, 0, 12)
[rint() for rint in [rint50] * 5 + [rint12] * 2]

可能性是无止境。Lambdas, randint(0, upperbound), randint(*args), 一个函数,它会根据调用频率等改变其结果。但我不认为其中任何一个实际上更具可读性或可理解性。

对于这种情况,只有 7 个值,我只需连接两个列表:

[randint(0, 50) for _ in range(5)] + [randint(0, 12) for _ in range(2)]

因为它更干净,更具可读性。创建包含两个列表推导结果的第三个列表的小的性能成本在这里可以忽略不计。


推荐阅读