列出朱莉娅的理解和元组

Jon*_*sen 6 julia

我想在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)

我觉得这很吸引人.所以我的问题是,朱莉娅有更好的方法吗?

Dan*_*etz 6

使用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迭代器形式?

  • @DanGetz 在 python 中有 [itertools](https://docs.python.org/2/library/itertools.html),它基本上包含与 julia 的 `Iterators.jl` 类似的迭代器。 (2认同)
  • @DanGetz,我想知道你是否可以对下面大卫·P·桑德斯的回答发表评论。既然生成器(如果我理解正确的话)在基础 Julia 中可用,那么到 2021 年,使用“Iterators.jl”有什么优势? (2认同)
  • @PatrickT 当然你是对的。随着 Julia 的变化,Stackoverflow 上的答案也应该发生变化。大卫·桑德斯的答案看起来不错(并且运行时间应该是相同的 - 尽管我没有检查)。事实上,SO 中的许多代码片段都可以被视为测试代码,SO 明智的做法是提供提供测试通过/失败的机制,并允许跟踪“标签”版本(代表工作环境)的测试。如果 SO 有好的 NLP 机器人或评论评论者,他们会选择这个想法并投票。 (2认同)

Dav*_*ers 5

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)