遍历列表中的元组并获取其值

时间:2018-08-03 08:35:36

标签: list erlang tuples

我有一个这样的列表,我想找到水果一词并提取“ Apple”和{“ 1”}。列表的大小可以不同。

列表= [{{“ 1”},{水果,“苹果”}},{{“ 2”},未知},{{“ 3”},{蔬菜,“土豆”}}]]

2 个答案:

答案 0 :(得分:6)

您应该阅读一些基本的Erlang书籍来开始。例如LearnYouSomeErlang

您的问题通常通过列表理解中的模式匹配来解决,这是直接在shell中的示例:

1> List = [{{"1"},{fruit,"Apple"}},{{"2"},unknown},{{"3"},{vegetable,"Potato"}}].
[{{"1"},{fruit,"Apple"}},
 {{"2"},unknown},
 {{"3"},{vegetable,"Potato"}}]
2> [{Fruit,Qty} || {{Qty},{fruit,Fruit}} <- List ].
[{"Apple","1"}]
3>

答案 1 :(得分:0)

这是一个使用多个函数子句而不是列表理解的解决方案:

-module(my).
-compile(export_all).


get_list() ->
[
    {{"1"},{fruit,"Apple"}},
    {{"2"},unknown},
    {{"3"},{vegetable,"Potato"}},
    {{"2"},{fruit,"Banana"}}
].


process_list([]) ->
    [];
process_list([ {{N}, {fruit, Fruit}} | Tail]) ->
    [{N, Fruit} | process_list(Tail) ];
process_list([_Head | Tail]) ->
    process_list(Tail).

在外壳中:

7> c(my).                            
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

8> my:process_list(my:get_list()).
[{"1","Apple"},{"2","Banana"}]

第二个函数子句尝试匹配包含原子fruit的列表开头的元组。如果列表的开头是包含fruit的元组,则将水果的数量和类型添加到结果列表中。

如果第二个函数子句不匹配,即列表的头是不包含原子fruit的元组,则第三个函数子句将匹配,并丢弃列表的头

最后,当您到达列表的末尾时,第一个函数子句将匹配,并返回空列表,该列表将cons'ed整齐地返回到结果列表的末尾,从而使其成为适当的列表

解决此问题的另一种方法是引入累加器来收集结果:

process_list(L) ->
    process_list(L, []).  %The empty list for the second argument is the accumulator.

process_list([], Acc) ->
    lists:reverse(Acc);
process_list([ {{N}, {fruit, Fruit}} | Tail], Acc) ->
    process_list(Tail, [ {N,Fruit} | Acc ]);  %Add the match to the accumulator.
process_list([_Head | Tail], Acc) ->
    process_list(Tail, Acc).

正如您在Pascal的示例中看到的那样,Erlang的列表理解功能可以在很短的代码中完成相同的事情。