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

4 回答 4

12

lists:append 完全符合您的需要:

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

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

于 2010-05-26T16:26:05.083 回答
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。如果您的字符串的处理方式与单纯的字符列表不同,那么它们可能应该成为一个真正的数据结构,请参阅此博客条目以获取有关此问题的有趣讨论。

于 2010-05-26T09:16:28.257 回答
1

列表:concat/1 作品...

于 2010-05-26T16:12:16.270 回答
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)].

它的行为就像 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"]
于 2010-06-11T12:24:12.817 回答