在向量上使用过滤器
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 为一组。如果不是,则需要其他方法。
我正在尝试对一个名为 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 为一组。如果不是,则需要其他方法。