Erlang 元组列表与另一个元组列表在单个列表中

Posted

技术标签:

【中文标题】Erlang 元组列表与另一个元组列表在单个列表中【英文标题】:Erlang list of tuples with another list of tuples inside to a single list 【发布时间】:2014-09-17 00:10:36 【问题描述】:

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

传入数据类似于(它可能远不止示例,但只有一个子级别):

[
  [
    d1, "1", 
    d2, "2", 
    sub_data,
      [
        d1, "3",
        d2, "4"
      ]
    
  ], 
  [
    d1, "5",
    d2, "6"
  ]
]

我需要将其序列化为:

["1", "2", "> 3", "> 4", "5", "6"]

现在我正在这样做,这不是一个好方法 imo:

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
).

【问题讨论】:

你的例子背后的逻辑很难概括,我希望像[["1", "2", "&gt; 3", "&gt; 4"], ["5", "6"]][["1", "2", ["&gt; 3", "&gt; 4"]], ["5", "6"]][["1", "2", ["3", "4"]], ["5", "6"]]这样的东西 嗯,它是氮元素的元组 id, name 的列表。 【参考方案1】:

这是我想出的:

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.

【讨论】:

【参考方案2】:

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

[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>

但是你没有说是否可以在子列表中有超过3个元组,如果数据和子数据的任何组合都是可能的...... 是否有可能有这个输入:

[
  [
    d1, "1", 
    d2, "2", 
    sub_data,
      [
        d1, "3",
        d2, "4"
      ]
    
    d3, "2", 
  ], 
  [
    sub_data,
      [
        d1, "3",
      ]
    
    d1, "5",
    d2, "6"
  ]
]

预期的结果应该是什么?

【讨论】:

输出格式["1", "2", "&gt; 3", "&gt; 4", "5", "6"]似乎也不太实用..

以上是关于Erlang 元组列表与另一个元组列表在单个列表中的主要内容,如果未能解决你的问题,请参考以下文章

从列表中删除 nil - Erlang

在 Python 元组列表中查找重复项

Erlang复合数据结构基础之元组与列表

如何将元组列表解压缩到单个列表中? [复制]

将列表作为单个元素插入到元组中

尝试在 Erlang 中组合列表的问题