我想在Julia中做这个Python代码的功能.(查找组合值大于7的两个列表中的所有对.)
#Python
def sum_is_large(a, b):
return a + b > 7
l1 = [1,2,3]
l2 = [4,5,6]
l3 = [(a,b) for a in l1 for b in l2 if sum_is_large(a, b)]
print(l3)
Run Code Online (Sandbox Code Playgroud)
Julia中没有列表推导的"if".如果我使用filter(),我不确定我是否可以传递两个参数.所以我最好的建议是这样的:
#Julia
function sum_is_large(pair)
a, b = pair
return a + b > 7
end
l1 = [1,2,3]
l2 = [4,5,6]
l3 = filter(sum_is_large, [(i,j) for i in l1, j in l2])
print(l3)
Run Code Online (Sandbox Code Playgroud)
我觉得这很吸引人.所以我的问题是,朱莉娅有更好的方法吗?
使用Julia中非常受欢迎的包Iterators.jl:
using Iterators # install using Pkg.add("Iterators")
filter(x->sum(x)>7,product(l1,l2))
Run Code Online (Sandbox Code Playgroud)
是生成对的迭代器.所以要获得与OP相同的打印输出:
l3iter = filter(x->sum(x)>7,product(l1,l2))
for p in l3iter println(p); end
Run Code Online (Sandbox Code Playgroud)
迭代器方法可能具有更高的内存效率.当然,人们可以l3 = collect(l3iter)得到一对矢量.
@ user2317519,好奇,是否有一个等效的python迭代器形式?
Guards ( if) 现在在 Julia v0.5 中可用(目前处于发布候选阶段):
julia> v1 = [1, 2, 3];
julia> v2 = [4, 5, 6];
julia> v3 = [(a, b) for a in v1, b in v2 if a+b > 7]
3-element Array{Tuple{Int64,Int64},1}:
(3,5)
(2,6)
(3,6)
Run Code Online (Sandbox Code Playgroud)
请注意,生成器现在也可用:
julia> g = ( (a, b) for a in v1, b in v2 if a+b > 7 )
Base.Generator{Filter{##18#20,Base.Prod2{Array{Int64,1},Array{Int64,1}}},##17#19}(#17,Filter{##18#20,Base.Prod2{Array{Int64,1},Array{Int64,1}}}(#18,Base.Prod2{Array{Int64,1},Array{Int64,1}}([1,2,3],[4,5,6])))
Run Code Online (Sandbox Code Playgroud)