在向量上使用过滤器

伊万·希德

我试图filter在一个dataset像这样定义的向量上使用该函数

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

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

(filter (contains "AK") dataset)

哪个会返回:

AK,0.89,0.98

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

蒂姆X

基本答案是肯定的,您可以使用过滤器执行此操作。过滤器需要谓词函数,即返回true或false的函数。过滤器函数将迭代您传入的集合中的元素,并将该集合中的每个元素传递给谓词。谓词函数内部的操作完全由您决定(尽管您应确保避免产生副作用)。过滤器会将谓词返回true的所有元素收集到一个新的惰性序列中。

本质上,您有(长格式)

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

col是您的收藏集。结果将是谓词函数返回true的元素的LAZY SEQUENCE。重要的是要了解诸如filter和map之类的东西会返回惰性序列,并知道其真正含义。

要了解的关键是您的收藏夹的结构。在您的描述中,您说

我试图在一个称为数据集的向量上使用filter函数,其定义如下:

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组,然后将每个组传递给谓词函数。这就是发挥map,filter,reduce等功能真正作用的地方-您可以转换数据,将其传递给一系列功能,每个功能都以某种方式操纵数据,并最终输出最终结果。

关键是要了解哪些过滤器(以及其他类似函数,例如map或reduce)将被理解为输入集合中的“元素”。基本上,这与在集合上调用“ first”所返回的内容相同。这就是在Fileter中传递给谓词函数的内容。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章