作者:赞达人 | 来源:互联网 | 2023-05-22 15:42
所以我是Erlang的新手并且还在学习曲线上,一个问题就是返回列表中的所有元素,然后是相同的元素,我可以这样做.例如...
in_pair_lc([a,a,a,2,b,a,r,r,2,2,b,a]) -> [a,a,r,2]
然后我被要求使用列表理解来做同样的事情,然后我击中了我的心理障碍.我不成功的尝试是这样的:
in_pair_lc([]) -> [];
in_pair_lc([H|T]) ->
[X || X ,_ [H|T], X=lists:nth(X+1, [H|T]).
虽然在列表中没有预见它不起作用.在此先感谢您的帮助.
1> Steve Vinosk..:
使用列表解析执行此操作的一种方法是从输入列表创建两个列表:
一个包含除第一个元素之外的所有元素
一个包含除最后一个元素之外的所有元素
通过将这两个列表压缩在一起,我们得到一个元组列表,其中每个元组由输入列表中的相邻元素组成.然后我们可以使用列表推导来仅获取其元素匹配的元组:
in_pair_lc([_|T]=L) ->
[_|T2] = lists:reverse(L),
[H || {H,H} <- lists:zip(lists:reverse(T2),T)].
编辑:根据评论中的讨论,使用Erlang/OTP版本17.0或更新版本,两个列表反转可以替换为lists:droplast/1
:
in_pair_lc([_|T]=L) ->
[H || {H,H} <- lists:zip(lists:droplast(L), T)].
第一个示例适用于较早版本和较新版本的Erlang/OTP.