首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数据的高效解构与比对

数据的高效解构与比对
EN

Stack Overflow用户
提问于 2018-07-15 12:25:37
回答 1查看 71关注 0票数 1

我刚开始在clojure中尝试使用不同的“破坏”(Destructing)。所以我想在这里实现的是,我有两个数据集,就像下面的代码片段:

代码语言:javascript
复制
(def result {"Major" { [200 {1 5,2 6, 3 4}] [ 201 {1 5,2 10,4 10,6 10}]}
             "Minor" { [ 200 {1 5,2 6,3 4,4 10}] [ 201 {1 5,2 10,3 10}]}})

我想获取每个未成年人的数据集条目,并将其与其相应的主要数据集条目进行比较,如果主要数据集条目的值是次要数据集的子集,那么从数据集(即主要的和次要的).Else assoc中删除该条目,即在其他变量中删除该条目(即主要项--只有&次要项-只有)。反之亦然。

例如:-

{"Major" { [200 {1 5,2 10, 3 10}] [201 {1 5,2 10,4 10,6 10}] [204 {1 4,2 5,3 8,4 9}]} "Minor" { [200 {1 5,2 10,3 10,4 10}] [203 {1 5,2 10,3 10}] [204 {1 4,2 5,3 8}]}})

  • major-only将是:- {201 value} (因为它在未成年人中不存在),{204 value} (因为主语的值不是键204的次要值的子集)。
  • minor-only将是:-{203 value}(因为它在{204 value}中不存在),{204 value}条目(因为子集条件失败)

在对数据进行销毁和比较时,我尝试用update-in来执行update-in,但没有找到获得预期结果的有效方法。这里有人能帮我吗?

另外,我希望返回函数的结果如下:-

{:major-only专业-仅限:minor-only次要-},如何返回这种类型的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-15 13:28:06

我不确定您的所有规则对我来说都是完全清楚的,但是下面是您所描述的函数的实现。

首先,我定义了一个map-subset?函数:

代码语言:javascript
复制
(defn map-subset? [m1 m2]
  (and (<= (count m1) (count m2))
       (every?
         (fn [[k v]]
           (and (contains? m2 k)
                (= (m2 k) v)))
         m1)))

这可能不是你所说的“子集”的确切含义,所以可以随意调整它。

这是你的数据。我删除了地图中对周围的方括号,因为您的问题使用了无效的EDN,我假设这就是您的意思:

代码语言:javascript
复制
(def data {"Major" {200 {1 5, 2 10, 3 10}
                    201 {1 5, 2 10, 4 10, 6 10}
                    204 {1 4, 2 5, 3 8, 4 9}}
           "Minor" {200 {1 5, 2 10, 3 10, 4 10}
                    203 {1 5, 2 10, 3 10}
                    204 {1 4, 2 5, 3 8}}})

因此,核心功能相对简单:

代码语言:javascript
复制
(let [{:strs [Major Minor]} data]
  {:major-only (into {}
                     (remove (fn [[k v]]
                               (map-subset? v (Minor k))))
                     Major)
   :minor-only (into {}
                     (remove (fn [[k v]]
                               (map-subset? v (Major k))))
                     Minor)})

这将重新构建每个映射,删除其值为其他映射中相应值的子集的条目:

代码语言:javascript
复制
{:major-only {201 {1 5, 2 10, 4 10, 6 10}
              204 {1 4, 2 5, 3 8, 4 9}}
 :minor-only {200 {1 5, 2 10, 3 10, 4 10}
              203 {1 5, 2 10, 3 10}}}

这与在您的示例中产生的结果略有不同,这就是为什么我不能完全确定我是否理解您的需求,因为从我对地图子集的解释来看,梅杰的200是未成年人的200的子集,小调的204是梅杰的204的子集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51348361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档