如何使用列表:重复?

时间:2016-11-10 18:15:17

标签: erlang

我想知道是否可以使用列表:在这种情况下重复:

decompress_1([])->
      [];
decompress_1(L)->
      MyNum = lists:map(fun(T)-> element(1,T) end,L),
      Res = lists:map(fun(T)-> element(2,T) end,L).

得到:

decompress_1([{3,1},{3,2},{1,5},{1,4},{1,1},{1,0},{1,1}]) == [1,1,1,2,2,2,5,4,1,0,1]

我只是设法检索元组的第一个和第二个元素。 有一个列表理解的解决方案,但我知道没有。

decompress([]) ->
     [];
decompress(L) ->
     [Y || {X, Y} <- L, _ <- lists:seq(1, X)].

1 个答案:

答案 0 :(得分:0)

在不使用列表推导的情况下,我们可以使用lists:duplicate/2来创建结果,但我们必须将其展平以获得所需的最终答案:

decompress([]) ->
    [];
decompress(L) ->
    lists:flatten(lists:map(fun({X,Y}) ->
                                    lists:duplicate(X,Y)
                            end, L)).

如果没有flatten,我们会得到下面显示的第一个结果,而不是第二个正确的结果:

1> decompress_no_flatten([{3,1},{3,2},{1,5},{1,4},{1,1},{1,0},{1,1}]).
[[1,1,1],[2,2,2],[5],[4],[1],[0],[1]]
2> decompress([{3,1},{3,2},{1,5},{1,4},{1,1},{1,0},{1,1}]).
[1,1,1,2,2,2,5,4,1,0,1]

顺便说一句,你也可以在原始列表理解方法中使用lists:duplicate/2

decompress([]) ->
    [];
decompress(L) ->
    [Y || {X,Y} <- L, _ <- lists:duplicate(X,Y)].

这是有效的,因为我们不使用lists:seq/2lists:duplicate/2生成的值,而是仅使用它们生成的项目数。