Clojure从zipmap获得最高值
所以我在这里得到了我提议的zip地图,它非常有效。如你所见,我已经加载了数据 这就是repl中的外观,它是完美的。 这是地图Clojure从zipmap获得最高值,clojure,Clojure,所以我在这里得到了我提议的zip地图,它非常有效。如你所见,我已经加载了数据 这就是repl中的外观,它是完美的。 这是地图 :Year 2020, :Day 27, :January 59, :February 38 :Year 2020, :Day 28, :January 41, :February 57 :Year 2020, :Day 29, :January 56, :February 51 :Year 2020, :Day 31, :January 94, :February -9
:Year 2020, :Day 27, :January 59, :February 38
:Year 2020, :Day 28, :January 41, :February 57
:Year 2020, :Day 29, :January 56, :February 51
:Year 2020, :Day 31, :January 94, :February -999
:Year 2020, :Day 30, :January 76, :February -999
(map [:Day :Month
请记住,这只是我完成的代码的一小部分。你会如何建议我在一月份找到价值最高的一天?我所说的最高值是指月份旁边的数字
(into(sorted-map-by >(fn [:January]))Ha)
我尝试了这一点但没有成功,最后的“Ha”只是我初始化zipmap并使用io/reader读取文件的函数名,不确定您的确切数据结构是什么样子,但假设它是一个映射向量,您可以这样做:
(def数据
[{:2020年:第27天:1月59日:2月38日]
{:2020年:第28天:1月41日:2月57日}
{:2020年:第29天:1月56日:2月51日}
{:2020年:第31天:1994年1月:1999年2月}
{:2020年,第30天,第76年1月,第999年2月})
(->)数据
(分类:一月)
最后的
:一月)
;; => 94
通过使用关键字作为函数在地图中查找向量值,对向量进行排序,然后获取一月值最高的向量,然后从该向量中获取属于键:一月的值。如果您的数据结构看起来有点不同,请告诉我。我将使用和:
@鲁尔的回答很好。
如果没有max key
,它将是:
(def data [{:Year 2020, :Day 27, :January 59, :February 38}
{:Year 2020, :Day 28, :January 41, :February 57}
{:Year 2020, :Day 29, :January 56, :February 51}
{:Year 2020, :Day 31, :January 94, :February -999}
{:Year 2020, :Day 30, :January 76, :February -999}])
(defn seq-max [seq greater key]
(reduce (fn [a b] (if (greater (key a) (key b)) a b)) seq))
;; if no key is wanted, choose the function `identity` as key!
;; e.g.
;; (seq-max (map :January data) > identity)
;; => 94
(:Day (seq-max data > :January)) ;; => 31
如果不使用zipmap
,则更容易。取cols 0,1,2,在col 2中找到max,然后提取day。对cols 0,1,3(2月)重复上述步骤。等等。zipmap更难的原因是什么?是的,我的数据结构与此完全相同,但在我加载它的文件中,只是另一个简单的问题,您如何返回1月最高值的年份和日期?我试图更新你的答案,但我的帐户是相当新的,所以它不允许我:/@Codemosh你可以选择多个键,例如,应用多个函数(关键字)你想要的结果。使用与上述相同的max key
方法(apply max key f
基本上与->>按f最后排序
的性能可能稍好一点)可以获得((juxt:Year:Day:一月:二月)(apply max key:January m));=>[2020 31 94-999]
@Codemosh,或者您可以使用let
绑定等(let[{:keys[Year-Day-January]}(apply-max-key:January-m)][Year-Day-January-二月];=>[2020 31 94-999]
。你能给我一个关于这两个函数都在做什么的小解释吗?我不想把一些我不理解的东西带到一起,尽管这是一个非常好的答案:)这两个函数都很容易理解。使用我答案中的链接访问文档,阅读它们的功能,并在REPL中亲自尝试。我应该提到reduce
对于处理序列非常实用。基本上(减少f[1 2 3 4])
的计算结果为(f(f(f(f(f 1 2)3)4)
。谢谢:)很好的呼叫-我以前从未使用过max key
。尽管我会选择apply
而不是reduce
@AlanThompson,但你是对的:当你可以简单地执行(apply max key:一月数据)时,不需要使用reduce+partial
(def data [{:Year 2020, :Day 27, :January 59, :February 38}
{:Year 2020, :Day 28, :January 41, :February 57}
{:Year 2020, :Day 29, :January 56, :February 51}
{:Year 2020, :Day 31, :January 94, :February -999}
{:Year 2020, :Day 30, :January 76, :February -999}])
(defn seq-max [seq greater key]
(reduce (fn [a b] (if (greater (key a) (key b)) a b)) seq))
;; if no key is wanted, choose the function `identity` as key!
;; e.g.
;; (seq-max (map :January data) > identity)
;; => 94
(:Day (seq-max data > :January)) ;; => 31