Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure从zipmap获得最高值_Clojure - Fatal编程技术网

Clojure从zipmap获得最高值

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

所以我在这里得到了我提议的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 -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