基本答案是肯定的,您可以使用过滤器来做到这一点。过滤器需要一个
谓词函数,即返回真或假的函数。过滤器
函数将遍历您传入的集合中的元素并传递
从该集合到谓词的每个元素。你在里面做什么
谓词功能完全取决于您(尽管您应该确保避免
副作用)。过滤器将收集谓词返回的所有元素
true 变成一个新的惰性序列。
基本上,你有(长格式)
(filter (fn [element]
; some test returning true/fals) col)
col 是你的集合。结果将是元素的惰性序列
谓词函数返回true的地方。了解这一点很重要
filter 和 map 之类的东西会返回惰性序列,并且知道它的真正含义。
要了解的关键点是您的收藏结构。在你的
描述,你说的
我正在尝试对称为数据集的向量使用过滤器功能
是这样定义的:
AK,0.89,0.98 AR,0.49,0.23 AN,0.21,0.78 ...
很遗憾,您的描述有点模棱两可。如果您的数据集结构
实际上是一个向量的向量(不仅仅是一个向量),那么事情就很
直截了当。这是因为这意味着每个“元素”传递给
谓词函数将是您的“内部”向量之一。真正的定义是
更准确地表示为
[
[AK,0.89,0.98]
[AR,0.49,0.23]
[AN,0.21,0.78]
...
]
将传递给谓词的是一个由 3 个元素组成的向量。如果你只想
选择第一个元素为“AK”的所有向量,然后选择谓词
函数可以很简单
(fn [el]
(if (= "AK" (first el))
true;
false))
所以整行应该是这样的
(filter (fn [el]
(if (= "AK" (first el))
true
false)) [[AK 0.89 0.98] [AR 0.49 0.23] [AN 0.21 0.78]])
这只是开始且非常冗长的版本。你可以做很多事情
让这个更短,例如
(filter #(= "AK" (first %)) [..])
另一方面,如果你真的只有一个向量,那么事情
变得有点复杂,因为你需要以某种方式将
价值观。这可以通过使用分区函数来分解你的
在将它们传递给过滤器之前将向量分成 3 个项目组,例如
(filter pred (partition 3 col))
这会将原始向量中的元素分组为 3 组并传递
每个组到谓词函数。这就是地图的真正威力,
过滤,减少等开始发挥作用 - 你可以转换数据,传递它
通过一系列函数,每个函数都以某种方式操纵数据和
一个最终的结果弹出结束。
关键是要了解什么是过滤器(以及其他类似的功能,例如
作为地图或减少)将理解为您输入中的“元素”
收藏。基本上,这与“first”返回的内容相同
呼吁收藏。这是传递给谓词函数的内容
过滤器。
这里有很多假设。主要之一是您的数据是
严格排序,即您要测试的值始终是第一个
每个组中的元素。如果不是这种情况,则需要做更多的工作
完毕。同样,我们假设数据总是以 3 个为一组。如果不是,则需要其他方法。