在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。啊,这让问题变得更难!