Erlang列表:用一个元素展平

时间:2014-12-10 22:50:49

标签: erlang

为什么erlangs列出:如果嵌套列表只包含一个元素,则flatten不返回列表。

示例:

DeepList = [[],[],["ONE"],[],[]].
[[],[],["ONE"],[],[]]
lists:flatten(DeepList).
"ONE"

这使我的下面的序列很难包含一个列表:foreach因为它看到" ONE"作为列表并尝试迭代它。我确定我错过了更好的方法。任何指导都将不胜感激。

1 个答案:

答案 0 :(得分:2)

" ONE"也是一个列表(在这种情况下,发生的整数对应于可打印的字符值)。

如果你看到这个,你不会感到惊讶:

1> lists:flatten([[],[],[1,2,3],[],[]]).
[1,2,3]

现在看看这个:

2> lists:flatten([[],[],[79,78,69],[],[]]).
"ONE"

通常,处理" string"更容易(并且 更高效)数据作为二进制文件:

3> lists:flatten([[],[],<<"ONE">>,[],[]]). 
[<<"ONE">>]

效率更高&#34;部分来自您可能会对二进制数据进行的其他操作(如匹配,拆分等)以及二进制文件的内存占用量大幅减少。

修改

在这种情况下,我忘了提及string:join/2string:tokens/2结合的力量:

4> string:tokens(string:join([[],[],"ONE",[],[]], " "), " ").
["ONE"]
5> string:tokens(string:join([[],[],"ONE",[],"Two"], " "), " ").
["ONE","Two"]

但是......虽然这是一个漂亮的黑客,它会受到黑客攻击的各种不良方面的困扰(它的丑陋,不清楚,不能说出你的意思,是不公正的,并且效率大大低于处理二进制文件)。