Erlang:展平字符串列表
Posted
技术标签:
【中文标题】Erlang:展平字符串列表【英文标题】:Erlang : flattening a list of strings 【发布时间】:2011-02-24 01:57:30 【问题描述】:我有一个这样的列表:
[["str1","str2"],["str3","str4"],["str5","str6"]]
我需要把它转换成
["str1", "str2", "str3", "str4", "str5", "str6"]
我该怎么做?
问题是我正在处理字符串列表,所以当我这样做时
lists:flatten([["str1","str2"],["str3","str4"],["str5","str6"]])
我明白了
"str1str2str3str4str5str6"
但是,如果原始列表中的元素只是原子,那么lists:flatten
就会给我我需要的东西。如何使用字符串实现相同的效果?
【问题讨论】:
【参考方案1】:lists:append 完全符合您的需要:
1> lists:append([["str1","str2"],["str3","str4"],["str5","str6"]]).
["str1","str2","str3","str4","str5","str6"]
(lists:concat 做了正确的事情,但也威胁要进行一些类型转换。)
【讨论】:
【参考方案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 以获取有关此问题的有趣讨论。
【讨论】:
如果你想要一个更通用的方法,你可能想看看 io_lib:printable_list/1。即仅在列表不可打印时展平。list:foldl(fun erlang:'++'/2, [], List)
更短。【参考方案3】:
lists:concat/1 作品...
【讨论】:
【参考方案4】:lists: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"]
【讨论】:
以上是关于Erlang:展平字符串列表的主要内容,如果未能解决你的问题,请参考以下文章