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

これは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"]
于 2010-06-11T12:24:12.817 に答える