我有一个(很长的)表单列表:
[[X, A], [Y, B]]
我想重新排列以获得:
[[X,Y], [A, B]]
我该怎么做?
答案 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
返回一个元组列表,因此您需要将每个元组转换为一个列表。