如何使用clojure查找列表中多次出现的数字
我有一张号码表2 4 3 7 4 9 8 5 12 24 8 我需要找到在clojure中重复多次的数字 我使用了如何使用clojure查找列表中多次出现的数字,clojure,Clojure,我有一张号码表2 4 3 7 4 9 8 5 12 24 8 我需要找到在clojure中重复多次的数字 我使用了频率函数来查找。但结果是 {2 1,4 2,3 1,7 1,9 1,8 2,5 1,12 1,24 1} 我最初考虑将它们视为键值,然后取每个键值一次,看看val是否大于1。如果值大于1,则需要加1 但我无法解决这个问题 谁能帮帮我吗 < P> >无论如何,我可以把它变成 [[ 2 1 ] [4 2 ] [3 1 ] [9 1 ] [8 2 ] [ 2 ] [YOX] [OS] ]
频率
函数来查找。但结果是
{2 1,4 2,3 1,7 1,9 1,8 2,5 1,12 1,24 1}
我最初考虑将它们视为键值
,然后取每个键值一次,看看val是否大于1。如果值大于1,则需要加1
但我无法解决这个问题
谁能帮帮我吗
< P> >无论如何,我可以把它变成<代码> [[ 2 1 ] [4 2 ] [3 1 ] [9 1 ] [8 2 ] [ 2 ] [YOX] [OS] ] /代码>并考虑每个向量递归或任何更好的想法,你可以想到。
谢谢。你走对了方向 如果你在散列映射上排序,e。G通过映射,您可以获得所描述的kv元组结构,并可以在元素转换函数中对单个元组进行分解:
(->> s
(frequencies)
(map (fn [[number times]]
(cond-> number ; take number
(> times 1) (inc))))) ; inc if (times > 1), otherwise return number
如果您想要重复的项目:
(defn repeated [coll]
(->> coll
frequencies
(remove #(= 1 (val %)))
keys))
(repeated [2 4 3 7 4 9 8 5 12 24 8])
;(4 8)
如果您只想数一数:
(defn repeat-count [coll]
(->> coll
frequencies
(remove #(= 1 (val %)))
count))
(repeat-count [2 4 3 7 4 9 8 5 12 24 8])
;2
你可以懒洋洋地做,这样它就可以无休止地工作:
(defn repeated [coll]
((fn ff [seen xs]
(lazy-seq
(when-let [[y & ys] (seq xs)]
(case (seen y)
::several (ff seen ys)
::once (cons y (ff (assoc seen y ::several) ys))
(ff (assoc seen y ::once) ys)))))
{} coll))
(repeated [2 4 3 7 4 9 8 5 12 24 8])
;(4 8)
这类似于coredistinct
。。。最后,为了简洁起见
(defn repeated [coll]
(for [[k v] (frequencies coll) :when (not= v 1)] k))
我偷了你的
钥匙。它只适用于地图。但在这里,它在一系列映射条目上运行得非常好 以下功能将在您卡住的地方继续:
(defn find-duplicates [numbers]
(->> numbers
(frequencies)
(filter (fn [[k v]] (> v 1)))
(keys)))
它将过滤值大于1的映射条目,然后提取它们的键
(find-duplicates [2 4 3 7 4 9 8 5 12 24 8])
;; => (4 8)
您可以使用这种方法
(def c [2 4 3 7 4 9 8 5 12 24 8])
(->> c
sort
(partition-by identity)
(filter #(> (count %) 1))
(map first))
(>>s(按标识分组)(筛选(comp next val))键)
这很好,但计算成本更高,要达到与其他解决方案相同的计算复杂度,您可以选择按分组
,而无需排序
(即O(nlogn)
)