在向量上使用过滤器

Using Filter on vectors

我正在尝试对一个名为 dataset 的向量使用 filter 函数,该向量的定义如下:

AK,0.89,0.98
AR,0.49,0.23
AN,0.21,0.78
...

我想获取包含特定字符串的所有值,如下所示:

(filter (contains "AK") dataset)

哪个 return:

AK,0.89,0.98

是否可以使用过滤功能来做到这一点? 我已经使用 doseq 遍历向量,但我需要在我的代码中的某个点使用 filter 。 谢谢:)

基本的答案是肯定的,你可以使用过滤器来做到这一点。过滤器需要一个 谓词函数,即 return 为真或假的函数。过滤器 函数将遍历你传入的 collection 中的元素并传入 从 collection 到谓词的每个元素。你在里面做什么 谓词函数完全取决于你(尽管你应该确保避免 副作用)。过滤器将收集谓词 returned 所在的所有元素 真正进入一个新的惰性序列。

基本上,你有(长格式)

(filter (fn [element] 
         ; some test returning true/fals) col)

其中 col 是您的 collection。结果将是元素的惰性序列 其中谓词函数 returned 为真。重要的是要明白 过滤和映射 return 惰性序列之类的东西,知道那是什么意思。

要理解的关键是 collection 的结构。在你的 描述,你说

I am trying to use the filter function over a vector called dataset that is defined like so:

AK,0.89,0.98 AR,0.49,0.23 AN,0.21,0.78 ...

不幸的是,您的描述有点含糊。如果你的数据集结构 实际上是向量的向量(不仅仅是向量),那么事情就很 straight-forward。这是因为这意味着每个 'element' 传递给 谓词函数将是您的 'inner' 向量之一。真正的定义是 更准确地表示为

[
 [AK,0.89,0.98]
 [AR,0.49,0.23]
 [AN,0.21,0.78]
 ...
]

将传递给谓词的是一个包含 3 个元素的向量。如果你只是想 select 第一个元素为 '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 组并通过 每个组到谓词函数。这就是地图的真正力量所在, 过滤、减少等开始发挥作用——你可以转换数据,传递它 通过函数管道,每个函数都以某种方式操纵数据和 最后弹出一个最终结果。

关键是要了解什么过滤器(以及其他类似的功能,例如 作为 map 或 reduce)将理解为输入中的 'element' collection。基本上,这与 'first' 编辑的 return 相同 在 collection 上呼吁。这是传递给谓词函数的内容 过滤器。

这里有很多假设。其中一个主要问题是您的数据是 严格排序,即您要测试的值始终是第一个 每个组中的元素。如果不是这种情况,则需要做更多的工作 完毕。同样,我们假设数据总是以 3 为一组。如果不是,则需要其他方法。