我有一个这样的清单:
[["str1","str2"],["str3","str4"],["str5","str6"]]
我需要将其转换为
["str1", "str2", "str3", "str4", "str5", "str6"]
我该怎么做?
问题是我正在处理字符串列表,所以当我这样做时
lists:flatten([["str1","str2"],["str3","str4"],["str5","str6"]])
我得到了
"str1str2str3str4str5str6"
但是,如果原始列表的元素只是原子,那么lists:flatten
会给我我需要的东西。如何用字符串实现相同的目标?
答案 0 :(得分:12)
列出:追加完全符合您的需要:
1> lists:append([["str1","str2"],["str3","str4"],["str5","str6"]]).
["str1","str2","str3","str4","str5","str6"]
(列出:concat做正确的事情,但也有可能做一些类型转换。)
答案 1 :(得分:2)
如果您的列表始终是“字符串列表”,那么您只需使用foldl
运算符,例如:
Flat = list:foldl(fun(X, Acc) -> X ++ Acc end, [], List)
如果你的列表嵌套可以是任意深度,我宁愿建议让erlang知道你的字符串不仅仅是字符列表,使用如下编码:
[[{string, "str1"},{string, "str2"}],
[{string, "str3"}, {string, "str4"}],
[{string, "str5"},{string, "str6"}]]
这样,list:flatten
会做正确的事情,并给予:
[{string, "str1"},{string, "str2"},
{string, "str3"}, {string, "str4"},
{string, "str5"},{string, "str6"}]
如果需要,您可以使用foldl
将其转换回原始字符串列表。
如果您的字符串与纯粹的字符列表的处理方式不同,那么它们可能应该是一个真实的数据结构,请参阅此blog entry以便就此问题进行有趣的讨论。
答案 2 :(得分:1)
列出:concat / 1有效...
答案 3 :(得分:0)
原因列表:flatten不适合你,因为Erlang中的字符串只是小整数的列表。如果列表只是一个字符串,我们可以使用一个停止在嵌套列表中递归的函数来处理它。
对于任意嵌套的字符串列表,您可以使用以下函数:
slab([]) ->
[];
slab([F|R]) ->
case io_lib:char_list(F) of
true -> [F|slab(R)];
false -> slab(F) ++ slab(R)
end.
它使用io_lib:char_list()来判断嵌套递归是否足够深。
操作示例:
1> slab([[["foo", "bar"], "baz", [[[["foobar"]]]], "froboz", "the end"]]).
["foo","bar","baz","foobar","froboz","the end"]
2>
一项小改进,可以使用混合嵌套列表:
slab([]) ->
[];
slab([F|R]) when is_list(F) ->
case io_lib:char_list(F) of
true -> [F|slab(R)];
false -> slab(F) ++ slab(R)
end;
slab([F|R]) ->
[F|slab(R)].
这就像list一样:flatten,除了它处理字符串就像它们没有列表一样:
1> slab([[["foo", "bar"], "baz", [[[["foobar", atom]],[a,b,c]]], 2, "froboz", "the end"]]).
["foo","bar","baz","foobar",atom,a,b,c,2,"froboz","the end"]