List Erlang元组列表,其中包含一个列表中的另一个元组列表

List Erlang元组列表,其中包含一个列表中的另一个元组列表,list,map,erlang,tuples,List,Map,Erlang,Tuples,所以,我正在寻找一个很好的方法来做到这一点 传入数据可能远不止示例,但只有一个子级别: [ [ {d1, "1"}, {d2, "2"}, {sub_data, [ {d1, "3"}, {d2, "4"} ] } ], [ {d1, "5"}, {d2, "6"} ] ] 我需要将此序列化为: [{1,2},{>3,4},{5,6}] 现在我这样做,在我看来这不是一个

所以,我正在寻找一个很好的方法来做到这一点

传入数据可能远不止示例,但只有一个子级别:

[
  [
    {d1, "1"}, 
    {d2, "2"}, 
    {sub_data,
      [
        {d1, "3"},
        {d2, "4"}
      ]
    }
  ], 
  [
    {d1, "5"},
    {d2, "6"}
  ]
]
我需要将此序列化为:

[{1,2},{>3,4},{5,6}]

现在我这样做,在我看来这不是一个好方法:

lists:map(fun(Data) ->
    [{f:g(d1, Data), f:g(d2, Data)}] ++
    [{"> " ++ f:g(d1, SubData)}, {"> " ++ f:g(d2, SubData)} 
     || SubData <- f:g(sub_data, Data)], 
    Data
).

以下是我的想法:

transform(Input) ->
        lists:flatten(lists:map(fun(Item) -> transform_item(Item, []) end, Input)).

transform_item(Item, Prefix) ->
        {KVs, SubDatas} = lists:partition(fun({sub_data, _}) -> false;
                                             (_) -> true
                                          end, Item),
        Res0 = list_to_tuple(lists:map(fun({_, Value}) -> Prefix ++ Value end, KVs)),
        [Res0, lists:map(fun({sub_data, SubItem}) -> transform_item(SubItem, "> ") end, SubDatas)].

test() ->
        case transform([[{d1, "1"}, {d2, "2"}, {sub_data, [{d1, "3"}, {d2, "4"}]}], [{d1, "5"}, {d2, "6"}]]) of
                [{"1", "2"}, {"> 3", "> 4"}, {"5", "6"}] -> io:format("SUCCESS");
                InvalidResult -> io:format("FAILED. Result=~p", [InvalidResult])
        end.

我在评论中的意思是,很难知道如何对输入进行概括。例如,可以想象您的输入被定义为具有以下结构的元素列表:

[{d1,V},{d2,V}] or
[{d1,V},{d2,V},{subdata,[{d1,V},{d2,V}]}]
在这种情况下,您可以使用以下函数进行转换:

1> F = fun(L) -> lists:reverse(lists:foldl(
            fun([{_,V1},{_,V2},{sub_data,[{_,V3},{_,V4}]}],Acc) -> [{"> " ++ V3,"> " ++ V4},{V1,V2}|Acc];
               ([{_,V1},{_,V2}],Acc) -> [{V1,V2}|Acc] end,
            [],L)) end.
#Fun<erl_eval.6.106461118>
2> F([[{d1,"1"},{d2,"2"},{sub_data,[{d1,"3"},{d2,"4"}]}],[{d1,"5"},{d2,"6"}]]).
[{"1","2"},{"> 3","> 4"},{"5","6"}]
3> F([[{d1,"1"},{d2,"2"},{sub_data,[{d1,"3"},{d2,"4"}]}],
      [{d1,"5"},{d2,"6"}],
      [{d1,"7"},{d2,"8"},{sub_data,[{d1,"9"},{d2,"10"}]}]]).
[{"1","2"},{"> 3","> 4"},{"5","6"},{"7","8"},{"> 9","> 10"}]
4>

那么预期的结果是什么?

你的例子背后的逻辑很难概括,我希望类似[[1,2,3,4],[5,6]]或[[1,2,3,4]],[5,6]]或[[1,2,3,4]],[5,6]]的东西,这是氮元素的元组列表{id,name}。输出格式,[{{1,2},{>3,>4},{5,6},看起来也不太实际。。
[
  [
    {d1, "1"}, 
    {d2, "2"}, 
    {sub_data,
      [
        {d1, "3"},
        {d2, "4"}
      ]
    }
    {d3, "2"}, 
  ], 
  [
    {sub_data,
      [
        {d1, "3"},
      ]
    }
    {d1, "5"},
    {d2, "6"}
  ]
]