Erlang: 将字符串列表展平

9

我有一个像这样的列表:

[["str1","str2"],["str3","str4"],["str5","str6"]]

我需要将它转换为:

我需要将其转换为

["str1", "str2", "str3", "str4", "str5", "str6"]

我该怎么做?

问题在于我正在处理字符串列表,所以当我执行

lists:flatten([["str1","str2"],["str3","str4"],["str5","str6"]])

我理解

"str1str2str3str4str5str6"

然而,如果原始列表中的元素只是原子,则lists:flatten会给我所需的内容。如何使用字符串实现相同的效果?

4个回答

12

lists:append 正是你需要的功能:

1> lists:append([["str1","str2"],["str3","str4"],["str5","str6"]]).
["str1","str2","str3","str4","str5","str6"]

(lists:concat做了正确的事情,但也可能进行一些类型转换。)


2
如果你的列表总是一个“字符串列表的列表”,那么你可以简单地使用foldl运算符,例如:
```haskell foldl (\acc x -> acc ++ concat x) "" yourList ```
这将把所有的字符串连接成一个字符串。
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将其转换回原始字符串列表,如果需要的话。 如果要处理的字符串与字符列表不同,则它们可能值得成为一个真正的数据结构,有关此问题的有趣讨论,请参见此博客文章


3
如果你想要一个更通用的方法,你可以查看io_lib:printable_list/1。也就是说,只有在列表不可打印时才进行展平。 - Lukas
1
list:foldl(fun erlang:'++'/2, [], List) 这个更短。 - nox

1

lists:concat/1 可以正常工作...


0

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)].

这个函数的行为与lists: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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接