2017-06-17 33 views
0

我有一个有趣的情况。我正在循环列表几次,我不知道如何生成我想要的列表。我基本上试图按照外部列表的顺序在元组列表中排列第二个元组。在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 
     c_id 
    end 
    end) 
end 

从这个代码的输出是:

[[2, 5, nil, nil, nil, nil, nil, nil], [nil, nil, 4, 6, nil, nil, nil, nil], 
[nil, nil, nil, nil, 3, 7, nil, nil], [nil, nil, nil, nil, nil, nil, 1, 8]] 

我需要的输出为[2,5,4,6,3,7,1,8],但会再次要求我遍历它在一个嵌套循环来拉这些号码的开出。所以很明显,我错过了一些东西,我如何循环并在第一次提取正确的数据?

回答

3

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] 
+0

我也喜欢'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))' – amorphid