我有一个这样的列表,我想找到水果一词并提取“ Apple”和{“ 1”}。列表的大小可以不同。
列表= [{{“ 1”},{水果,“苹果”}},{{“ 2”},未知},{{“ 3”},{蔬菜,“土豆”}}]] >
答案 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的列表理解功能可以在很短的代码中完成相同的事情。