如何获取仅包含唯一值的列表?

时间:2014-11-19 23:29:54

标签: netlogo

我有一个如下列表:

[[178 440] [175 440] [160 468] [160 440]]

每个子列表中的值对应于坐标x,y。

我想获得一个仅包含x和y的唯一值的列表。

从上面的列表中,结果将是:

[[178 440] [160 468]]

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

根据你的例子,我认为通过" unique",你的意思是"到目前为止没有遇到"。

这是一种方法,使用非常灵活的reduce

to go
  let pairs [[178 440] [175 440] [160 468] [160 440]]
  print reduce [ 
    ifelse-value (is-unique? ?2 ?1)
      [ lput ?2 ?1 ]
      [ ?1 ]
    ] fput [] pairs
end

to-report is-unique? [ pair other-pairs ]
  report
    (not member? (first pair) (map first other-pairs)) and
    (not member? (last pair) (map last other-pairs))
end

is-unique?报告者应该很容易理解:它使用map来提取每个first项{em> x )member? 1}},并检查other-pairs的第一项是否不是last。它对reduce项( y )执行相同的检查。

{{3}}部分有点棘手,但也不是那么难。我们在对象列表(pair)的前面添加一个空列表,我们将用作"累加器"对于符合我们标准的对。传递给fput [] pairs的记者中的这个累加器将?1,而reduce依次是我们的每一对。所以我们在其中做的只是检查?2相对于到目前为止累积的对是否是唯一的。如果是,我们将其添加到我们的累积对列表中。如果不是,我们会按原样退出列表,然后转到下一个?2