我是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}元组列表中获取密钥的值有一个很好的方法吗?
答案 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.