我编写了一个Clojure函数,可以根据长度频率成功对列表进行排序。
但是,我不喜欢它的编写方式。有没有人有任何建议以不同的方式写这个?
(defn lfsort [n]
(let [total (frequencies (map #(count %) n))]
(sort #(< (total (count %1)) (total (count %2))) n)))
(lfsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o)))
((i j k l) (o) (a b c) (f g h) (d e) (d e) (m n))
亲切的问候, 本。
答案 0 :(得分:3)
(defn lfsort [coll]
(sort-by (comp (frequencies (map count coll))
count)
coll))
我们如何从您的解决方案到达此处?首先,请注意(sort #(< (f %1) (f %2)) xs)
只是(sort-by f xs)
。然后,由于我们实际上只需要使用frequencies
调用一次的结果,我们可以将其内联,并使用count
进行组合以获取sort-by
函数。
您可能会或可能不会发现这比您发布的解决方案更具可读性;您可以通过不勾勒frequencies
来电来选择中间地带,但我认为使用sort-by
和comp
绝对比拼出sort
更好lambda你自己。
答案 1 :(得分:1)
另一种方法是:
(defn lfsort [n]
(->> n
(group-by count)
vals
(sort-by count)
(apply concat)))
例如,
(lfsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o)))
;((i j k l) (o) (a b c) (f g h) (d e) (d e) (m n))
我觉得这个更清楚了。你可能会也可能不会。