所以我是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]).
虽然在列表中没有展望但它不起作用。 感谢您提前提供任何帮助。
答案 0 :(得分:5)
使用列表解析执行此操作的一种方法是从输入列表创建两个列表:
通过将这两个列表压缩在一起,我们得到一个元组列表,其中每个元组由输入列表中的相邻元素组成。然后我们可以使用列表推导来仅获取其元素匹配的元组:
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。
答案 1 :(得分:0)
我不相信问题实际上是关于列表理解的。问题的核心是压缩列表,然后在列表解析中使用一个简单的“过滤器”表达式。
如果你想坚持基本的,长期存在的,erlang列表函数(sublist
,nthtail
),你可以使用以下内容:
X = [a,a,a,2,b,a,r,r,2,2,b,a].
[A || {A,A} <- lists:zip(lists:sublist(X, length(X)-1), lists:nthtail(1, X))].