在Erlang中查找{key,value}列表中的值

时间:2012-06-03 11:56:16

标签: list erlang tuples

我是Erlang的新手,也许我只是在教程中错过了这个问题,尽管它很简单。比方说,我有一个从erlang获得的{Key,Value}对的列表:fun_info / 1。我想知道函数arity,列表的其余部分对我没兴趣。所以我写了类似的东西:

find_value( _, [] ) ->
    nothing;
find_value( Key, [{Key, Value} | _] ) ->
    Value;
find_value( Key, [_ | T] ) ->
    find_value( Key, T).    

然后做:

find_value( arity, erlang:fun_info( F )).

我工作得很好,但是像find_value这样的东西应该是一个太常见的例程吗?我没能在BIF中找到它的类似物。所以问题是:从{key,value}元组列表中获取密钥的值有一个很好的方法吗?

5 个答案:

答案 0 :(得分:11)

模块proplists包含get_value/2,应该是您想要的。

答案 1 :(得分:10)

lists:keyfind/3这样做。在这里,我已将其映射到您的find_value/2界面:

find_value(Key, List) ->
    case lists:keyfind(Key, 1, List) of
        {Key, Result} -> Result;
        false -> nothing
    end.
不过,

proplists可能是一条更好的路线。

答案 2 :(得分:4)

由于list:keyfind / 3已经发布,我将提到另一个有用的选项,使用list comprehensions:

hd([ Value || {arity, Value} <- List ]).

这意味着获取所有值,使得每个元素都是“Value”,并且来自与List中的{arity,Value}匹配的元组。由于列表推导返回列表,我们得到该列表的头部。

使用它很有趣:

1> List=[{a,1},{b,2},{c,3}].
[{a,1},{b,2},{c,3}]
2> F=fun(What, List) -> hd([ Value || {Key, Value} <- List, Key =:= What]) end.
#Fun<erl_eval.12.82930912>
3> F(c, List).
3

答案 3 :(得分:2)

proplists:get_value如果您不关心速度,是否可以这样做

lists:keyfind这是性能的最佳选择,因为它是BIF。您可以使用element/2这样的

进行包装
element(2, lists:keyfind(K, 1, L))

你将获得与proplists相同的结果:get_value但更快。

来源: http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/

答案 4 :(得分:0)

find(K, [H|T]) ->
    case H of
        {K, V} -> V;
        _ -> find(K, T)
    end;
find(_, []) -> none.