Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药,我该如何重新排列这个列表?_Elixir - Fatal编程技术网

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,但对于两个列表来说,这是不值得的,因此我的实现不太通用,但对于仅两个列表的情况,它会稍微好一点。