在elixir中循环遍历列表而不创建nil值

时间:2017-06-17 19:17:23

标签: 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
      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],但这需要我在嵌套循环中再次循环它以拉出这些数字。所以很明显我错过了一些东西,如何在第一次循环并提取正确的数据?

1 个答案:

答案 0 :(得分: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]