例如,给定输入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)]
如何获得我想要的结果?
答案 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
是可读的。