在clojure中对序列进行重复数据消除
我需要定义一个接受序列的函数和一些作用于序列中元素的函数。它从旧序列返回一个序列,其中删除了具有重复函数值的元素在clojure中对序列进行重复数据消除,clojure,Clojure,我需要定义一个接受序列的函数和一些作用于序列中元素的函数。它从旧序列返回一个序列,其中删除了具有重复函数值的元素 (defn dedup [seq & functions] ...) 例如,如果 (f1 1) = 'a' (f1 2) = 'a' (f1 3) = 'c' (f1 4) = 'd' (f2 1) = 'za' (f2 2) = 'zb' (f2 3) = 'zc' (f2 4) = 'zb' 然后 返回(1-3)的序列 我该怎么做 编辑: 编辑测试值以避免产生误解
(defn dedup [seq & functions] ...)
例如,如果
(f1 1) = 'a'
(f1 2) = 'a'
(f1 3) = 'c'
(f1 4) = 'd'
(f2 1) = 'za'
(f2 2) = 'zb'
(f2 3) = 'zc'
(f2 4) = 'zb'
然后
返回(1-3)的序列
我该怎么做
编辑:
编辑测试值以避免产生误解
编辑:
下面是仅1个函数的情况下的(功能不太好)实现
(defn dedup [seq f]
(loop [values #{} seq1 seq seq2 '()]
(let [s (first seq1)]
(if (nil? s)
(reverse seq2)
(let [v (f s)]
(if (contains? values v)
(recur values (rest seq1) seq2)
(recur (conj values v) (rest seq1) (conj seq2 s))))))))
您的示例似乎与文本相矛盾-它返回两个函数一致的值
(defn dedup [seq & fns]
(for [s seq :when (apply = (map #(% s) fns))] s))
(dedup [1 2 3 4]
#(case % 1 "a" 2 "a" 3 "c" 4 "d")
#(case % 1 "a" 2 "b" 3 "c" 4 "b"))
(1 3)
也许那有点太紧凑了#(…%…)
相当于(fn[x](…x…)
,dup
中的map
运行函数,将它们全部应用于序列中的相同值
您还可以使用
(dedup [1 2 3 4] {1 "a" 2 "a" 3 "c" 4 "d"} {1 "a" 2 "b" 3 "c" 4 "b"})
(1 3)
ps我想可能是对英语意思的混淆。“重复”表示值重复。所以“a”是“a”的复制品。我怀疑您的意思是“多”-您希望删除获得多个(不同)值的条目
pps您也可以使用过滤器
:
(defn dedup [seq & fns]
(filter #(apply = (map (fn [f] (f %)) fns)) seq))
我需要显式地编写一个匿名函数,因为您无法嵌套
#(…)
您的示例似乎与文本相矛盾-它返回两个函数一致的值
(defn dedup [seq & fns]
(for [s seq :when (apply = (map #(% s) fns))] s))
(dedup [1 2 3 4]
#(case % 1 "a" 2 "a" 3 "c" 4 "d")
#(case % 1 "a" 2 "b" 3 "c" 4 "b"))
(1 3)
也许那有点太紧凑了#(…%…)
相当于(fn[x](…x…)
,dup
中的map
运行函数,将它们全部应用于序列中的相同值
您还可以使用
(dedup [1 2 3 4] {1 "a" 2 "a" 3 "c" 4 "d"} {1 "a" 2 "b" 3 "c" 4 "b"})
(1 3)
ps我想可能是对英语意思的混淆。“重复”表示值重复。所以“a”是“a”的复制品。我怀疑您的意思是“多”-您希望删除获得多个(不同)值的条目
pps您也可以使用过滤器
:
(defn dedup [seq & fns]
(filter #(apply = (map (fn [f] (f %)) fns)) seq))
我需要明确地编写一个匿名函数,因为你不能嵌套
#(…)
澄清对不起,我的意思是一个函数的值不应该重复,但两个函数可能具有相同的值。你的问题仍然不清楚。我不知道为什么从第一组函数中排除2而不是1。从我所看到的,它们都与一个重复(“a”)相关联。排除其中任何一个都可以。对不起,我的意思是一个函数的值不应该重复,但两个函数可能具有相同的值。你的问题仍然不清楚。我不知道为什么从第一组函数中排除2而不是1。在我看来,它们都与一个重复(“a”)相关联。排除其中任何一个都可以。澄清:对不起,我的意思是一个函数的值不应该重复,但两个函数可能具有相同的值。由于f1在1和2上返回相同的值,因此2被取出。因为f2在2和4上返回相同的值,所以取下4。啊,这让问题变得更难!澄清:对不起,我的意思是说一个函数的值不应该重复,但是两个函数可能有相同的值。由于f1在1和2上返回相同的值,因此2被取出。因为f2在2和4上返回相同的值,所以取下4。啊,这让问题变得更难!