代码之家  ›  专栏  ›  技术社区  ›  IvanHid

对向量使用过滤器

  •  0
  • IvanHid  · 技术社区  · 6 年前

    我在试着用 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
    

    是否可以使用过滤器功能执行此操作? 我已经使用doseq对向量进行了迭代,但是我必须使用 滤波器 谢谢:)

    1 回复  |  直到 6 年前
        1
  •  2
  •   Tim X    6 年前

    基本的答案是肯定的,你可以使用过滤器来做到这一点。筛选器需要 谓词函数,即返回真或假的函数。过滤器 函数将迭代您传入并传递的集合中的元素 谓词函数完全由您决定(尽管您应该确保避免 变成一个新的懒惰序列。

    基本上,你有(长格式)

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

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

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

    AK,0.89,0.98氩,0.49,0.23安,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 %)) [..])
    

    变得更复杂一点,因为你需要对 价值观。这可以通过使用配分函数来分解

    (filter pred (partition 3 col))
    

    将每个组添加到谓词函数。这就是地图的真正力量, 过滤、减少等等——你可以转换数据,传递数据 通过一个函数管道,每个函数以某种方式操纵数据和

    关键是要了解什么是过滤器(和其他类似的函数,例如 作为map或reduce)将理解为输入中的“元素” 拜访了收藏家。这就是传递给中谓词函数的内容 文件管理器。

    这里有很多假设。其中一个主要原因是你的数据 每个组中的元素。如果不是这样,那么就需要做更多的工作 完成。同样,我们假设数据总是3人一组。如果不是,那么就需要其他方法。