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", "> 3", "> 4"], ["5", "6"]]
或[["1", "2", ["> 3", "> 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", "> 3", "> 4", "5", "6"]
似乎也不太实用..以上是关于Erlang 元组列表与另一个元组列表在单个列表中的主要内容,如果未能解决你的问题,请参考以下文章