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

时间:2016-02-14 21:06:40

标签: list-comprehension julia

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

[(1,),(2,),(3,),(1,2),(1,3),(2,3),(1,2,3)]         

我尝试了类似python的语法:

combs = [comb for x in collect(1:n) for comb in combinations(collect(1:n),x)]

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

ERROR: LoadError: syntax: expected ]

我也试过这个:

combs = [comb for comb in vcat([combinations(collect(1:n),x) for x in collect(1:n)])]

但我得到了:

[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)]

如何获得我想要的结果?

1 个答案:

答案 0 :(得分:6)

n = 3
vcat([collect(combinations(1:n,i)) for i=1:n]...)

OK?

输出:

7-element Array{Array{Int64,1},1}:
 [1]    
 [2]    
 [3]    
 [1,2]  
 [1,3]  
 [2,3]  
 [1,2,3]

其他方法:

另一种方法是[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)]

尽管它使用的是BitVector内部,这可能很模糊。

为了提高记忆效率:

using Iterators
chain(([combinations(1:n,i) for i=1:n])...) |> collect

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

drop(subsets(1:n),1) |> collect

是可读的。