Julia 迭代器的乘积和过滤

3

我需要找到一个解决方案,使得三个数组中的数 a + b + c = 15(或任何其他值)。

目前我被以下代码卡住了:

A = 1:10
B = 1:10
C = 1:10

possibilities = Iterators.product(A, B, C)
solutions = Iterators.filter((a, b, c) -> a + b + c == 15, possibilities)
sol = collect(solutions)
for (a, b, c) in sol
   println(a, " ", b, " ", c)
end

我收到编译器的以下错误信息:

> ERROR: LoadError: MethodError: no method matching
> (::##1#2)(::Tuple{Int64,Int64,Int64}) Closest candidates are:  
> #1(::Any, !Matched::Any, !Matched::Any) at /home/cg/root/7729001/main.jl:6 Stacktrace:  [1] start_filter(::##1#2,
> ::Base.Iterators.Prod{UnitRange{Int64},Base.Iterators.Prod2{UnitRange{Int64},UnitRange{Int64}}})
> at ./iterators.jl:272  [2] _collect(::UnitRange{Int64},
> ::Base.Iterators.Filter{##1#2,Base.Iterators.Prod{UnitRange{Int64},Base.Iterators.Prod2{UnitRange{Int64},UnitRange{Int64}}}},
> ::Base.HasEltype, ::Base.SizeUnknown) at ./array.jl:408  [3]
> collect(::Base.Iterators.Filter{##1#2,Base.Iterators.Prod{UnitRange{Int64},Base.Iterators.Prod2{UnitRange{Int64},UnitRange{Int64}}}})
> at ./array.jl:397 while loading /home/cg/root/7729001/main.jl, in
> expression starting on line 7

也许您有解决此问题的想法或解决方法。
2个回答

5

可能性的元素是元组。在此代码中,将每个元素视为x

A = 1:10
B = 1:10
C = 1:10

possibilities = Iterators.product(A, B, C)
# The change is in this line
solutions = Iterators.filter(x -> x[1] + x[2] + x[3] == 15, possibilities)
sol = collect(solutions)
for (a, b, c) in sol
   println(a, " ", b, " ", c)
end

1
谢谢 @JuliaLearner,我很感激你的赞美。我也是一个学习者 :) - hesham_EE
是的,我从你的回答中学到了东西。我之前发布了一个使用数组推导的答案,但当我看到你的回答多么简洁明了时,我就删除了它。我希望提问者接受你的答案。 - Julia Learner
谢谢hesham_EE,我没有想到那个!我还在学习函数式编程的基础知识。 @JuliaLearner我们都是Julia的学习者 ;) - Thomas Jalabert

2
另一个答案正确地诊断出您需要处理元组,而不是三个参数。
在Julia 1.0中,您还可以在lambda中使用参数解构,但语法可能不够明显:
Iterators.filter(((a, b, c),) -> a + b + c == 15, possibilities)

谢谢你分享这个,我觉得你的表达更易读。 - Thomas Jalabert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接