2015-02-10 38 views
1

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

虽然在名单提前补偿不看这是行不通的。 感谢您提前提供任何帮助。与列表理解来做到这一点

回答

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的工作。

+0

我想我正确认识这个......你为什么要扭转列出两次?你不能只放下尾巴吗?它会将时间减少2倍。 – 2015-02-11 01:00:01

+0

仅在Erlang中添加['lists:droplast/1'](http://www.erlang.org/doc/man/lists.html#droplast-1)函数/ OTP 17.0,所以旧版本没有它。答案中的代码适用于新旧版本的Erlang/OTP。如果你有17.0或更新,你可以用'[H || {H,H} < - lists:zip(lists:droplast(L),T)]'来替换答案中的整个函数体。 – 2015-02-11 01:16:10

+0

啊,太好了,谢谢你的启发。我刚刚进入Erlang并拥有最新版本。 +1的便携性。 – 2015-02-11 01:17:19

0

我不相信这个问题真的是列表解析。问题的核心是压缩列表,然后在列表理解中使用一个简单的“过滤器”表达式。

如果你要坚持基础性,长期存在,二郎列表功能(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))]. 
相关问题