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