为什么erlangs列出:如果嵌套列表只包含一个元素,则flatten不返回列表。
示例:
DeepList = [[],[],["ONE"],[],[]].
[[],[],["ONE"],[],[]]
lists:flatten(DeepList).
"ONE"
这使我的下面的序列很难包含一个列表:foreach因为它看到" ONE"作为列表并尝试迭代它。我确定我错过了更好的方法。任何指导都将不胜感激。
答案 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/2
与string:tokens/2
结合的力量:
4> string:tokens(string:join([[],[],"ONE",[],[]], " "), " ").
["ONE"]
5> string:tokens(string:join([[],[],"ONE",[],"Two"], " "), " ").
["ONE","Two"]
但是......虽然这是一个漂亮的黑客,它会受到黑客攻击的各种不良方面的困扰(它的丑陋,不清楚,不能说出你的意思,是不公正的,并且效率大大低于处理二进制文件)。