You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:02:42