Erlang列表理解,遍历两个列表并排除值

时间:2010-03-13 04:35:19

标签: erlang list-comprehension

我需要在Erlang中生成一组坐标。给定一个坐标,比如说(x,y)我需要生成(x-1,y-1),(x-1,y),(x-1,y + 1),(x,y-1), (x,y + 1),(x + 1,y-1),(x + 1,y),(x + 1,y + 1)。基本上所有周围坐标除了中间坐标(x,y)。为了生成所有九个坐标,我现在这样做:

[{X,Y} || X<-lists:seq(X-1,X+1), Y<-lists:seq(Y-1,Y+1)]

但这会生成所有值,包括(X,Y)。如何使用列表推导中的过滤器从列表中排除(X,Y)?

3 个答案:

答案 0 :(得分:12)

[{X,Y} || X <- lists:seq(X0-1,X0+1),
          Y <- lists:seq(Y0-1,Y0+1), {X,Y} =/= {X0,Y0}].

答案 1 :(得分:2)

我认为区分参数和生成的值会有所帮助:

[{Xc,Yc} || Xc<-lists:seq(X-1,X+1), Yc<-lists:seq(Y-1,Y+1), Xc=/=X orelse Yc=/=Y]

或者

[{Xc,Yc} || Xc<-lists:seq(X-1,X+1), Yc<-lists:seq(Y-1,Y+1)] -- [{X,Y}]

答案 2 :(得分:1)

添加-- [{X,Y}]可能是最简单的事情。