【问题标题】:Filter an collection of tuples过滤一组元组
【发布时间】:2016-09-11 10:43:41
【问题描述】:

我在 Julia 中使用迭代和理解,并尝试编写简单的问题:找到所有小于 10 且乘积小于 10 的数字对。这是我的第一次尝试:

solution = filter((a,b)->a*b<10, product(1:10, 1:10))
collect(solution)

但我收到错误“参数数量错误”。这是意料之中的,因为过滤器内的匿名函数需要两个参数,但它得到一个元组。 我知道我能做到

solution = filter(p->p[1]*p[2]<10, product(1:10, 1:10))

但它看起来不像上面的那样好。有没有办法告诉我 (a,b) 是元组类型的参数并使用类似于第一个示例中的语法的东西?

【问题讨论】:

  • 对于这个具体的例子,你也可以调整函数的主体:a -&gt; prod(a) &lt; 10,但是@tup这个例子是非常巧妙的想法。

标签: filter tuples julia iterable


【解决方案1】:

我认为没有一种方法可以完全按照您的意愿行事,但您可以考虑以下一些替代匿名函数的方法:

x->let (a,b)=x; a*b<10 end
x->((a,b)=x; a*b<10)

如果你愿意,这些当然可以做成宏:

macro tup(ex)
    @assert ex.head == :(->)
    @assert ex.args[1].head == :tuple
    arg = gensym()
    quote
        $arg -> ( $(ex.args[1]) = $arg; $(ex.args[2]) )
    end
end

那么@tup (a, b) -&gt; a * b &lt; 10 会为所欲为。

Metaprogramming 在 Julia 中非常有用且很常见,适用于您一遍又一遍地做某事并希望为其提供专门语法的情况。但如果这是一次性的事情,我会避免这种元编程,因为添加新语法意味着学习新语法并使代码更难阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-11
    • 2017-09-29
    • 2016-08-20
    • 2016-01-10
    • 2013-05-03
    相关资源
    最近更新 更多