如何在列表推导中执行多个操作

Lew*_*wis 4 python list operation

L = [random.randint(0,50) for i in range(5) random.randint(0,12) for i in range(2)]
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ers 8

您可以randint()根据以下值改变第二个参数i:

[randint(0, 50 if i < 5 else 12) for i in range(7)]
Run Code Online (Sandbox Code Playgroud)

50 if i < 5 else 12表达会有什么变化传递给random.randint()最后两个迭代.

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

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

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]
Run Code Online (Sandbox Code Playgroud)

可能性是无止境.Lambda表达式,randint(0, upperbound),randint(*args),那将改变其效果取决于它是如何经常被称为等,但我不认为任何这些实际上是更可读或可理解的功能.

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

[randint(0, 50) for _ in range(5)] + [randint(0, 12) for _ in range(2)]
Run Code Online (Sandbox Code Playgroud)

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