我刚开始在clojure中尝试使用不同的“破坏”(Destructing)。所以我想在这里实现的是,我有两个数据集,就像下面的代码片段:
(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次要-},如何返回这种类型的值?
发布于 2018-07-15 13:28:06
我不确定您的所有规则对我来说都是完全清楚的,但是下面是您所描述的函数的实现。
首先,我定义了一个map-subset?函数:
(defn map-subset? [m1 m2]
(and (<= (count m1) (count m2))
(every?
(fn [[k v]]
(and (contains? m2 k)
(= (m2 k) v)))
m1)))这可能不是你所说的“子集”的确切含义,所以可以随意调整它。
这是你的数据。我删除了地图中对周围的方括号,因为您的问题使用了无效的EDN,我假设这就是您的意思:
(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}}})因此,核心功能相对简单:
(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)})这将重新构建每个映射,删除其值为其他映射中相应值的子集的条目:
{: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的子集。
https://stackoverflow.com/questions/51348361
复制相似问题