Clojure 对向量使用滤波器

Clojure 对向量使用滤波器,clojure,clojure-java-interop,Clojure,Clojure Java Interop,我试图在名为dataset的向量上使用filter函数,该向量的定义如下: AK,0.89,0.98 AR,0.49,0.23 AN,0.21,0.78 ... 我想得到包含某个字符串的所有值,如下所示: (filter (contains "AK") dataset) 这将返回: AK,0.89,0.98 是否可以使用过滤器功能执行此操作? 我已经使用doseq对向量进行了迭代,但是我需要在代码中的某个点使用过滤器。 谢谢:)基本答案是肯定的,您可以使用过滤器来完成此操作。筛选器需要一个

我试图在名为
dataset
的向量上使用
filter
函数,该向量的定义如下:

AK,0.89,0.98
AR,0.49,0.23
AN,0.21,0.78
...
我想得到包含某个字符串的所有值,如下所示:

(filter (contains "AK") dataset)
这将返回:

AK,0.89,0.98
是否可以使用过滤器功能执行此操作? 我已经使用doseq对向量进行了迭代,但是我需要在代码中的某个点使用
过滤器。

谢谢:)

基本答案是肯定的,您可以使用过滤器来完成此操作。筛选器需要一个 谓词函数,即返回真或假的函数。过滤器 函数将迭代您传入并传递的集合中的元素 从该集合到谓词的每个元素。你在房间里做什么 谓词函数完全由您决定(尽管您应该确保避免 副作用)。筛选器将收集谓词返回的所有元素 true转换为新的惰性序列

基本上,您有(长格式)

你的收藏在哪里。结果将是一个惰性的元素序列 其中谓词函数返回true。理解这一点很重要 像filter和map这样的东西会返回惰性序列,并且知道这到底意味着什么

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

我试图在名为dataset的向量上使用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

不幸的是,你的描述有点模棱两可。如果您的数据集结构 实际上是一个向量的向量(不仅仅是一个向量),那么事情就非常复杂了 直截了当。这是因为它将意味着每个“元素”都传递给 谓词函数将是“内部”向量之一。真正的定义是 更准确地表示为

[
 [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人一组。如果不是,那么就需要其他方法

基本答案是肯定的,您可以使用过滤器来完成此操作。筛选器需要一个 谓词函数,即返回真或假的函数。过滤器 函数将迭代您传入并传递的集合中的元素 从该集合到谓词的每个元素。你在房间里做什么 谓词函数完全由您决定(尽管您应该确保避免 副作用)。筛选器将收集谓词返回的所有元素 true转换为新的惰性序列

基本上,您有(长格式)

你的收藏在哪里。结果将是一个惰性的元素序列 其中谓词函数返回true。理解这一点很重要 像filter和map这样的东西会返回惰性序列,并且知道这到底意味着什么

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

我试图在名为dataset的向量上使用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

不幸的是,你的描述有点模棱两可。如果您的数据集结构 实际上是一个向量的向量(不仅仅是一个向量),那么事情就非常复杂了 直截了当。这是因为它将意味着每个“元素”都传递给 谓词函数将是“内部”向量之一。真正的定义是 更准确地表示为

[
 [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组并传递 将每个组添加到谓词函数。这就是地图的真正力量所在, 过滤、减少等发挥作用-您可以转换数据,传递数据 通过一系列函数,每个函数都以某种方式操纵数据和 最后会有一个结果

关键是要了解