Functional programming 在elixir中循环列表而不创建nil值

Functional programming 在elixir中循环列表而不创建nil值,functional-programming,elixir,Functional Programming,Elixir,我有一个有趣的情况。我在一个列表上循环了好几次,但我不知道如何生成我想要的列表。我实际上是在尝试根据外部列表的顺序对元组列表中的第二个元组进行排序 aclist = [{2,4},{2,6},{4,1},{4,8},{1, 2},{1,5},{3,3},{3,7}] plist = [1,2,3,4] newplist = for pid <- plist do Enum.map(aclist, fn({p_id,c_id}) -> if p_id == pid do

我有一个有趣的情况。我在一个列表上循环了好几次,但我不知道如何生成我想要的列表。我实际上是在尝试根据外部列表的顺序对元组列表中的第二个元组进行排序

aclist = [{2,4},{2,6},{4,1},{4,8},{1, 2},{1,5},{3,3},{3,7}]
plist = [1,2,3,4]
newplist = 
for pid <- plist do
  Enum.map(aclist, fn({p_id,c_id}) ->
    if p_id == pid do
      c_id
    end
  end)
end

我需要输出为
[2,5,4,6,3,7,1,8]
,但这需要我在嵌套循环中再次循环它以拉出这些数字。因此,很明显我遗漏了一些东西,我如何在它上面循环并第一次提取正确的数据呢?

for
是在这里使用的最佳选择。它允许迭代多个列表,同时生成一个平面列表作为结果,还允许过滤:

iex(1)> aclist = [{2,4},{2,6},{4,1},{4,8},{1, 2},{1,5},{3,3},{3,7}]
[{2, 4}, {2, 6}, {4, 1}, {4, 8}, {1, 2}, {1, 5}, {3, 3}, {3, 7}]
iex(2)> plist = [1,2,3,4]
[1, 2, 3, 4]
iex(3)> for pid <- plist, {p_id, c_id} <- aclist, p_id == pid, do: c_id
[2, 5, 4, 6, 3, 7, 1, 8]
iex(1)>aclist=[{2,4},{2,6},{4,1},{4,8},{1,2},{1,5},{3,3},{3,7}]
[{2, 4}, {2, 6}, {4, 1}, {4, 8}, {1, 2}, {1, 5}, {3, 3}, {3, 7}]
iex(2)>plist=[1,2,3,4]
[1, 2, 3, 4]

iex(3)>for pid
for
是这里使用的最佳选择。它允许迭代多个列表,同时生成一个平面列表作为结果,还允许过滤:

iex(1)> aclist = [{2,4},{2,6},{4,1},{4,8},{1, 2},{1,5},{3,3},{3,7}]
[{2, 4}, {2, 6}, {4, 1}, {4, 8}, {1, 2}, {1, 5}, {3, 3}, {3, 7}]
iex(2)> plist = [1,2,3,4]
[1, 2, 3, 4]
iex(3)> for pid <- plist, {p_id, c_id} <- aclist, p_id == pid, do: c_id
[2, 5, 4, 6, 3, 7, 1, 8]
iex(1)>aclist=[{2,4},{2,6},{4,1},{4,8},{1,2},{1,5},{3,3},{3,7}]
[{2, 4}, {2, 6}, {4, 1}, {4, 8}, {1, 2}, {1, 5}, {3, 3}, {3, 7}]
iex(2)>plist=[1,2,3,4]
[1, 2, 3, 4]

iex(3)>对于pid,我也喜欢
对于
。这一行并没有真正传达正在发生的事情=>
Enum.map(aclist,fn{p,ac}->{Enum.find_index(plist,&(&1==p)),ac}end)|>Enum.sort_by(&elem(&1,0))|>Enum.map(&elem(&1,1))
我也喜欢
for
。这一行并没有真正传达正在发生的事情=>
Enum.map(aclist,fn{p,ac}->{Enum.find_index(plist,&(&1==p)),ac}end)|>Enum.sort_by(&elem(&1,0))|>Enum.map(&elem(&1,1))