python - Perl 等同于 Python 的列表理解与嵌入式 if 语句?

标签 python perl

在 python 中,我可以执行以下操作以获取具有特定属性的列表中的所有对象。在这个例子中,我获取列表 objs 中每个 objid 字段列表,其中 obj.id 更大超过 100:

ids = [ obj.id for obj in objs if obj.id > 100]

我如何在 perl 中做同样的事情?我想我想使用 map,但我不知道如何有条件地将项从源集映射到目标集。

最佳答案

map block 可以为原始列表中的每个元素返回 0 个或多个元素。要省略一个元素,只需返回空列表 ():

my @ids = map { $_->id > 100 ? $_->id : () } @objs;

这假定 @objs 中的对象具有 id 属性和关联的访问器。如果您想要直接哈希访问,您也可以这样做:

my @ids = map { $_->{id} > 100 ? $_->{id} : () } @objs;

或者,您可以只组合 mapgrep:

my @ids = map { $_->id } grep { $_->id > 100 } @objs;

# Or reverse the order to avoid calling $_->id twice:
my @ids = grep { $_ > 100 } map { $_->id } @objs;

我不确定哪一个会更有效率,但除非 @objs 真的很大,否则这不太重要。

如果您从对象中提取的值的计算成本很高,那么您可以缓存该值以进行测试并返回值:

my @vals = map { my $v = $_->expensive_method;  $v > 100 ? $v : () } @objs;

关于python - Perl 等同于 Python 的列表理解与嵌入式 if 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4753969/

相关文章:

python - 使用 if 语句列出理解

python - list.__iadd__ 和 list.__add__ 的不同行为

perl - Perl 中的套接字编程

perl - 我应该使用哪个 Perl 数据库接口(interface)?

python - 在一行中间拆分时间戳

perl - 我如何需要一个不是属性的 Moose 构造函数参数?

python - 如何在 Blender Python 导出脚本中重新排序指向顶点的索引,以便正确连接我的模型?

包含反斜杠的多行字符串的 Python 3.5 分割线

python - 我可以在 Pydantic 中创建一个自动转换为日期时间的 Unix 时间类型吗?

Perl:以 "perl' ish"方式进行值映射