2010-05-26 53 views
9

的名單我有一個這樣的名單:二郎:扁平化的字符串

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

,我需要將其轉換爲

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

我該怎麼辦呢?

的問題是,我處理字符串列表,所以當我做

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

我得到

"str1str2str3str4str5str6" 

然而,如果原來的列表,只是原子的元素,那麼lists:flatten會給我我需要的東西。我如何在字符串中實現相同效果?

回答

12

名單:追加不正是你所需要的:

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

(名單:CONCAT做正確的事,但威脅做一些類型轉換太)

2

如果您的列表始終是一個,那麼你可以簡單地使用foldl運營商,擁有類似「字符串列表清單」:

Flat = list:foldl(fun(X, Acc) -> X ++ Acc end, [], List) 

在這種情況下你的列表嵌套可以任意深度的,我寧願建議,讓二郎知道你的字符串不是單純的文字列表,使用的編碼,如:

[[{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以獲得關於此問題的有趣討論。

+0

謝謝!它的工作原理:) – ErJab 2010-05-26 09:28:59

+3

如果你想要一個更通用的方法,你可能想看看io_lib:printable_list/1。即如果列表不可打印,則只能變平。 – Lukas 2010-05-26 09:47:31

+0

'list:foldl(fun erlang:'++'/ 2,[],List)'更短。 – nox 2013-01-16 16:36:37

1

列表:CONCAT/1 ...作品

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(),以決定是否嵌套遞歸是足夠深。

Exampe操作:

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

這種行爲就像列表:扁平化,除了它處理字符串如果他們將沒有列表:

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"]