Julia中所有可能长度的所有组合

Pig*_*gna 2 list-comprehension julia

例如,给定n = 3我想要获得的输入:

[(1,),(2,),(3,),(1,2),(1,3),(2,3),(1,2,3)]         
Run Code Online (Sandbox Code Playgroud)

我尝试了类似python的语法:

combs = [comb for x in collect(1:n) for comb in combinations(collect(1:n),x)]
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误消息:

ERROR: LoadError: syntax: expected ]
Run Code Online (Sandbox Code Playgroud)

我也试过这个:

combs = [comb for comb in vcat([combinations(collect(1:n),x) for x in collect(1:n)])]
Run Code Online (Sandbox Code Playgroud)

但我得到了:

[Base.Combinations{Array{Int64,1}}([1,2,3],1),Base.Combinations{Array{Int64,1}}([1,2,3],2),Base.Combinations{Array{Int64,1}}([1,2,3],3)]
Run Code Online (Sandbox Code Playgroud)

如何得到我想要的结果?

Dan*_*etz 6

n = 3
vcat([collect(combinations(1:n,i)) for i=1:n]...)
Run Code Online (Sandbox Code Playgroud)

好?

输出:

7-element Array{Array{Int64,1},1}:
 [1]    
 [2]    
 [3]    
 [1,2]  
 [1,3]  
 [2,3]  
 [1,2,3]
Run Code Online (Sandbox Code Playgroud)

其他方法:

另一种方法是[65-findin(bits(i),'1') for i=1:(2^n-1)]指出一种非常有效的实现方式:

tmp = BitVector(sizeof(Int)*8)
[begin tmp.chunks[1]=i; find(tmp) end for i=1:(2^n-1)]
Run Code Online (Sandbox Code Playgroud)

虽然它使用BitVector内部,这可能是模糊的.

为了记忆效率:

using Iterators
chain(([combinations(1:n,i) for i=1:n])...) |> collect
Run Code Online (Sandbox Code Playgroud)

(可以在for循环中直接用作迭代器).但Iterators有人可以使用:

drop(subsets(1:n),1) |> collect
Run Code Online (Sandbox Code Playgroud)

这是可读的.

  • @Pigna你不能在同一个理解中有两个`for`s,但你可以在游戏中拥有更多的那个变量,即.n维理解,每个维度一个,例如:`[i + j + k for i = 1:3,j = 1:3,k = 1:3]`返回__*3x3x3*__ 3维`阵列{Int64,3}`. (3认同)
  • 是的,理解在里面有一个`for`.但你写的第二个版本几乎是正确的.在嵌套理解中使用另一个`for`就可以了.你应该注意`combination`返回一个迭代器,所以`collect`应该在`vcat`之前完成. (2认同)