编写Clojure函数以根据长度频率对列表列表进行排序

时间:2016-12-08 17:42:49

标签: list function clojure

我编写了一个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))

亲切的问候, 本。

2 个答案:

答案 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-bycomp绝对比拼出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))

我觉得这个更清楚了。你可能会也可能不会。