Erlang список понимания, обход двух списков и исключая значения - PullRequest
7 голосов
/ 13 марта 2010

Мне нужно сгенерировать набор координат в Эрланге. Учитывая одну координату, скажем, (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 ]

12 голосов
/ 13 марта 2010
[{X,Y} || X <- lists:seq(X0-1,X0+1),
          Y <- lists:seq(Y0-1,Y0+1), {X,Y} =/= {X0,Y0}].
2 голосов
/ 13 марта 2010

Я думаю, что различие между параметрами и сгенерированными значениями поможет немного:

[{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}]
1 голос
/ 13 марта 2010

Добавление -- [{X,Y}], вероятно, будет самой простой вещью.

...