2016-12-08 35 views
0

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

亲切的问候, 本。

+1

你不喜欢你如何写它?它太慢了,还是有其他原因? – octopusgrabbus

回答

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更好。

+0

嗨amalloy,完美谢谢!这是我不喜欢的那种lambda。 – benjano

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)) 

我觉得这是更清晰。你可能也可能不会。

+0

奇怪的是,这个解决方案具有与['@ amalloys's'](http://stackoverflow.com/a/41045711/1562315)相同数量的标记和相同数量的括号, – Thumbnail

相关问题