使用列表推导返回所有元素后跟相等的元素

时间:2015-02-10 22:31:21

标签: list erlang

所以我是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]).

虽然在列表中没有展望但它不起作用。 感谢您提前提供任何帮助。

2 个答案:

答案 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列表函数(sublistnthtail),你可以使用以下内容:

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))].