defmodule Itertools
def combinations(_, 0), do: [[]]
def combinations([], _), do: []
def combinations([h|t], m) do
(for l <- combinations(t, m-1), do: [h|l]) ++ combinations(t, m)
end
end
我正在处理数组上的嵌套循环,该循环可以由Python的itertools.combinations之类的东西处理,但在标准库中看不到。 elixir是否内置在某个地方,还是有更好的方法在Elixir中的列表上模拟三角环?
我从rosettacode.org btw获得了上面的代码。
答案 0 :(得分:0)
与Erlang类似,Elixir没有内置功能来进行组合。正如Rosettacode所说的“此Elixir代码刚刚从Erlang转换而来”:
defmodule RC do
def comb(0, _), do: [[]]
def comb(_, []), do: []
def comb(m, [h|t]) do
(for l <- comb(m-1, t), do: [h|l]) ++ comb(m, t)
end
end
{m, n} = {3, 5}
list = for i <- 1..n, do: i
Enum.each(RC.comb(m, list), fn x -> IO.inspect x end)
答案 1 :(得分:0)
我不知道有任何内置方法可以执行此操作,但是GitHub上的Comb
包可以做到这一点。
您当然需要将其添加到您的mix.exs
依赖项中:
[
{:comb, git: "https://github.com/tallakt/comb.git", tag: "master"}
]
然后您可以像这样使用它(取自上面链接的GitHub文档):
iex> combinations(1..3, 2) |> Enum.to_list
[[1, 2], [1, 3], [2, 3]]
iex> combinations([1, 1, 2, 2], 3) |> Enum.to_list
[[1, 1, 2], [1, 2, 2]]
它还支持笛卡尔积:
iex> cartesian_product(1..2, 3..4)
[[1, 3], [1, 4], [2, 3], [2, 4]]