Elixir 长生不老药,我该如何重新排列这个列表?
我有一长串的表格:Elixir 长生不老药,我该如何重新排列这个列表?,elixir,Elixir,我有一长串的表格: [[X, A], [Y, B]] 我想重新排列它以获得: [[X,Y], [A, B]] 我该怎么做呢?您不会重新排列它,因为它是不可变的。 但是,您可以使用模式匹配从旧列表中获取目标零件。 然后,您可以用这些零件构建一个新列表,该列表将具有您想要的形状 # Suppose l = [[X, A], [Y, B]] [[X, A], [Y, B]] = l l2 = [[X, Y], [A, B]] 那么l2正是您想要的 # Suppose l = [[X, A], [
[[X, A], [Y, B]]
我想重新排列它以获得:
[[X,Y], [A, B]]
我该怎么做呢?您不会重新排列它,因为它是不可变的。 但是,您可以使用模式匹配从旧列表中获取目标零件。 然后,您可以用这些零件构建一个新列表,该列表将具有您想要的形状
# Suppose l = [[X, A], [Y, B]]
[[X, A], [Y, B]] = l
l2 = [[X, Y], [A, B]]
那么l2正是您想要的
# Suppose l = [[X, A], [Y, B]]
[[X, A], [Y, B]] = l
l2 = [[X, Y], [A, B]]
演示:
# 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]]]
FWIW,如果你想成为长生不老药的专业人士,这种任务应该是多次手工完成的,没有任何第三方,甚至没有核心库 递归规则 defmodulezip-do def zip!输入,acc\\[] def zip![[uu,[]],acc, do:Enum.reverseacc def zip![[]、[uu3]、acc、, do:Enum.reverseacc def zip![h1 | t1]、[h2 | t2]、acc、, 多:拉链![t1,t2],[h1,h2]| acc] 终止 拉链,拉链![:x,:a],:y,:b]] ⇒[:x,:y],:a,:b]] 我假设您希望查看您的列表: Enum.zip[:a,:b,:c],[1,2,3]|>Enum.map和Tuple.to_list/1 输出: [:a,1],:b,2],:c,3]]
之所以使用,是因为Enum.zip/2返回一个元组列表,所以您需要将每个元组转换为一个列表。Enum.zip[['x','a'],['y','b']].\124;>Enum.map&tuple.to_list/1可能有效,[['x','y'],['a','b']],这取决于您所指的长列表。例如:Enum.zip[['x',a',1],'y',b',2]]|>Enum.map&Tuple.to_list/1产生['x',y',['a',b'],[1,2]]。此外,Enum.zip对原子的工作方式也不同。压缩像[['x',a'],['y',b'],[1,2]]这样的列表会产生[['x',y',1],'a',b',2]]您的意思是:给定两个列表的输入,生成两个新列表,其中相同位置的元素成对出现?或者你的意思是:给定一个2元素列表的列表,生成一个新的2元素列表,第一对的第二个元素和第二对的第一个元素交换?我认为,如果您在示例列表中添加第三项,然后检查核心库的实现,会更加清晰甚至不使用Enum.reverse/1。@AdamMillerchip您的链接指的是私有reducer实现。是的,指的是公共函数调用的实际实现。公共函数显然会使用reverse/1。我们不能递归地减少添加到head的次数,也不能逆转结果。它也会经过Stream.reduce,但对于两个列表来说,这是不值得的,因此我的实现不太通用,但对于仅两个列表的情况,它会稍微好一点。