List 使用列表理解返回所有元素,后跟相等的元素

List 使用列表理解返回所有元素,后跟相等的元素,list,erlang,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]).

所以我是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]).
虽然在列表中没有前瞻性,但它不起作用。
感谢您的帮助。

列表理解的一种方法是从输入列表中创建两个列表:

  • 包含除第一个元素以外的所有元素的元素
  • 包含除最后一个元素以外的所有元素的元素
通过将这两个列表压缩在一起,我们得到一个元组列表,其中每个元组由输入列表中的相邻元素组成。然后,我们可以使用列表理解仅获取元素匹配的元组:

in_pair_lc([_|T]=L) ->
    [_|T2] = lists:reverse(L),
    [H || {H,H} <- lists:zip(lists:reverse(T2),T)].

第一个示例适用于旧版本和新版本的Erlang/OTP。

一种列表理解方法是从输入列表创建两个列表:

  • 包含除第一个元素以外的所有元素的元素
  • 包含除最后一个元素以外的所有元素的元素
通过将这两个列表压缩在一起,我们得到一个元组列表,其中每个元组由输入列表中的相邻元素组成。然后,我们可以使用列表理解仅获取元素匹配的元组:

in_pair_lc([_|T]=L) ->
    [_|T2] = lists:reverse(L),
    [H || {H,H} <- lists:zip(lists:reverse(T2),T)].

第一个示例适用于旧版本和新版本的Erlang/OTP。

我不认为问题真的与列表理解有关。问题的核心是压缩列表,然后在列表理解中使用一个简单的“过滤器”表达式

如果您想坚持使用基本的、长期存在的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))].
X=[a,a,a,2,b,a,r,r,2,2,2,b,a]。

[A |{A,A}我不认为问题真的与列表理解有关。问题的核心是压缩列表,然后在列表理解中使用一个简单的“过滤器”表达式

如果您想坚持使用基本的、长期存在的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))].
X=[a,a,a,2,b,a,r,r,2,2,2,b,a]。

[A |{A,A}我想我的理解是正确的…为什么要颠倒列表两次?难道你不能放下尾巴吗?这将减少2倍的时间。该函数只在Erlang/OTP 17.0中添加,所以旧版本没有。答案中的代码适用于Erlang/OTP的新版本和旧版本。如果你有17.0或更高版本,你可以替换答案中带有
[H |{H,H}的整个函数体啊,太好了,谢谢你启发我。我刚进入Erlang,我有了最新版本。+1用于可移植性。删除列表的最后一个元素仍然效率低下。由于列表是单链接且不可变的,删除最后一个元素需要遍历和复制它。以下是标准中
列表:droplast/1
的源代码图书馆(有有趣的评论):我想我的理解是正确的…为什么你要颠倒列表两次?难道你不能放下尾巴吗?这将减少2倍的时间。该函数只在Erlang/OTP 17.0中添加,所以旧版本没有。答案中的代码适用于Erlang/OTP的新版本和旧版本。如果你有17.0或更高版本,你可以替换它用
[H |{H,H}表示答案中的整个函数体啊,太好了,谢谢你启发我。我刚进入Erlang,我有了最新版本。+1用于可移植性。删除列表的最后一个元素仍然效率低下。由于列表是单链接且不可变的,删除最后一个元素需要遍历和复制它。以下是标准中
列表:droplast/1
的源代码图书馆(附有有趣的评论):