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)
如何得到我想要的结果?
是
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)
这是可读的.