Elixir,我该如何重新排列此列表?

时间:2019-02-14 13:39:08

标签: elixir

我有一个(很长的)表单列表:

[[X, A], [Y, B]]

我想重新排列以获得:

[[X,Y], [A, B]]

我该怎么做?

3 个答案:

答案 0 :(得分:2)

您不会“重新排列”它,因为它是不可变的。 但是,您可以通过模式匹配从较早的列表中获取目标零件。 然后,您可以从这些零件中构建一个新列表,使其具有所需的形状。

# Suppose l = [[X, A], [Y, B]]
[[X, A], [Y, B]] = l
l2 = [[X, Y], [A, B]]

然后l2正是您想要的。

演示:

# Create such a list, with:
#    X = [:a, :b]
#    A = [:c, :d]
#    Y = [:e, :f]
#    B = [:g, :h]
iex(1)> l = [[[:a, :b], [:c, :d]], [[:e, :f], [:g, :h]]]
[[[:a, :b], [:c, :d]], [[:e, :f], [:g, :h]]]

# Through pattern matching, assign the target parts to X, A, Y and B
iex(2)> [[X, A], [Y, B]] = l
[[[:a, :b], [:c, :d]], [[:e, :f], [:g, :h]]]

# Then create a new list from these parts
iex(3)> l2 = [[X, Y], [A, B]]
[[[:a, :b], [:e, :f]], [[:c, :d], [:g, :h]]]

答案 1 :(得分:2)

FWIW,如果您想成为Elixir专业人士,这种任务应该是手工完成的,没有任何第三方甚至核心图书馆。

递归规则。

defmodule Zip do
  def zip!(input, acc \\ [])
  def zip!([_, []], acc),
    do: Enum.reverse(acc)
  def zip!([[], _], acc),
    do: Enum.reverse(acc)
  def zip!([[h1|t1], [h2|t2]], acc),
    do: zip!([t1, t2], [[h1, h2] | acc])
end

Zip.zip!([[:x, :a], [:y, :b]])
#⇒ [[:x, :y], [:a, :b]]

答案 2 :(得分:0)

我假设您要zip您的列表:

Enum.zip([:a, :b, :c], [1, 2, 3]) |> Enum.map(&Tuple.to_list/1)

输出:

[[:a, 1], [:b, 2], [:c, 3]]

使用Tuple.to_list/1是因为Enum.zip/2返回一个元组列表,因此您需要将每个元组转换为一个列表。