【问题标题】:Using Filter on vectors对向量使用过滤器
【发布时间】:2018-09-15 20:19:50
【问题描述】:

我正在尝试在一个名为 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 对向量进行了迭代,但我需要在代码中的某个位置使用filter。 谢谢:)

【问题讨论】:

    标签: clojure clojure-java-interop


    【解决方案1】:

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

    基本上,你有(长格式)

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

    col 是你的集合。结果将是元素的惰性序列 谓词函数返回true的地方。了解这一点很重要 filter 和 map 之类的东西会返回惰性序列,并且知道它的真正含义。

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

    我正在尝试对称为数据集的向量使用过滤器功能 是这样定义的:

    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 个为一组。如果不是,则需要其他方法。

    【讨论】:

    • 如果 OP 有一个字符串向量 - 而不是将字符串划分为向量,他们只能查看字符串的前 2 个字符。对于大型向量,这会更快,因为它不需要在每一行上构建新向量。
    猜你喜欢
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 2020-01-21
    相关资源
    最近更新 更多