Erlang如何获取列表中指定元素的位置?
如何在Erlang中获取列表元素的位置?
确实,Erlang标准库的lists模块里没有直接返回元素位置的函数,不过我们可以自己实现,或者用一些组合技巧来搞定这个需求。下面给你两种实用的方法:
方法一:递归实现自定义函数
这是最直观也最高效的方式,通过递归遍历列表并维护当前索引,找到目标元素时返回索引值。比如你例子里name的位置是7(看起来是从1开始计数的),我们可以这么写:
element_position(Element, List) -> % 初始调用从索引1开始,如果你需要从0开始,把这里改成0就行 element_position(Element, List, 1). % 递归终止条件:列表空了还没找到,返回not_found element_position(_Element, [], _Index) -> not_found; % 找到目标元素,返回当前索引 element_position(Element, [Element|_Rest], Index) -> Index; % 没找到,继续遍历剩余列表,索引加1 element_position(Element, [_|Rest], Index) -> element_position(Element, Rest, Index + 1).
调用示例:
1> MyList = [id,container,feed_id,prev,next,feeds,name,street,street_no,firstname,lastname,email,password,phone]. [id,container,feed_id,prev,next,feeds,name,street,street_no,firstname,lastname,email,password,phone] 2> element_position(name, MyList). 7
方法二:用lists模块的组合函数实现
如果不想写递归,也可以用lists:zip和lists:keyfind来组合实现,原理是把元素和对应的索引配对后查找:
element_position(Element, List) -> % 生成从1开始的索引序列,和原列表配对 IndexedPairs = lists:zip(lists:seq(1, length(List)), List), % 查找第二个元素为目标的配对项 case lists:keyfind(Element, 2, IndexedPairs) of {Index, _} -> Index; false -> not_found end.
不过要注意,这个方法会先遍历列表获取长度,再遍历一次查找元素,效率比递归稍低,适合处理小规模的列表。
另外要说明的是:如果列表里有重复的元素,以上两种方法都会返回第一个出现的元素位置,因为找到匹配项后就会停止遍历。
内容的提问来源于stack exchange,提问作者Jon Riel
相关产品推荐
相关产品推荐

