python - 如何在列表理解中执行多项操作
问题描述
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 个随机数?
解决方案
您可以根据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)]
因为它更干净,更具可读性。创建包含两个列表推导结果的第三个列表的小的性能成本在这里可以忽略不计。
推荐阅读
- c++ - 我的电脑无法编译数据类型:__int128
- swift - Firebase 引用对象不会保存到 SwiftUI 中的变量
- google-apps-script - 为我从我拥有的模板创建的 Google 表格文件的副本禁用自动评论通知
- sql - 为移动平均定义窗口函数框架
- assembly - 重置字符串变量以在循环中打印多个用户输入(NASM 程序集)
- ruby-on-rails - 将模式标记属性添加到 Quill.js 内部 HTML
- operating-system - 按下电源按钮时硬件中断?
- python - 将文件中的数据添加到类字典中
- php - 数据表控制台错误 jQuery.Deferred 异常:无法设置属性“_DT_CellIndex”
- asp.net-core-mvc - 如何在 Visual Studio 2019 for mac 中搭建标识文件?