Return 所有元素后跟使用列表理解的相等元素

Return all elements followed by an equal element using list comprehensions

所以我是 Erlang 的新手并且仍在学习曲线上,一个问题是 return 列表中的所有元素后跟一个相等的元素,我可以做到。 例如...

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

尽管在 list comp 中没有向前看,但它不起作用。 提前感谢您的帮助。

使用列表推导式执行此操作的一种方法是从输入列表创建两个列表:

  • 一个包含除第一个元素以外的所有元素
  • 一个包含除最后一个元素之外的所有元素

通过将这两个列表压缩在一起,我们得到一个元组列表,其中每个元组由输入列表中的相邻元素组成。然后我们可以使用列表推导来只获取那些元素匹配的元组:

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 的新旧版本。

我不认为问题真的出在列表理解上。问题的核心是压缩列表,然后在列表理解中使用一个简单的 "filter" 表达式。

如果您想坚持使用基本的、长期存在的 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))].