从地图计算地图中的值

时间:2012-08-30 06:39:56

标签: clojure

一个仍在学习的clojure-newbie(我)得到了一张地图列表 每张地图包含一个帐号和其他信息
(例如({:account 123,:type“PK”,:end“01.01.2013”​​,...} {:account 456:type“GK”:end“01.07.2016”,...}) 现在我需要一个按顺序递增一个数字和帐号的函数 (如{1, 123, 2, 456 etc})。无论我做了什么,我都没有得到它。

我曾经学过Delphi,就像

那样

for i :=1 to (count MYMAP)
do (put-in-a-list i AND i-th account number in the list)
inc i

由于某些限制,我不允许使用核心功能,也不能使用“use”,“ns”,“require”,“cycle”,“time”,“loop”,“while “,”defn“,”defstruct“,”defmacro“,”def“,”defn“,”doall“,”dorun“,”eval“,”read-string“,”反复“,”重复“,”迭代“ “,”import“,”slurp“,”吐“。

而且 - 如果英语不好,请原谅我 - 我用英语问这些问题并不常见。

2 个答案:

答案 0 :(得分:3)

对于散布有帐号的自然数字的懒惰序列,您可以尝试以下内容:

(interleave ; splices together the following sequences
 (map inc (range)) ; an infinite sequence of numbers starting at 1
 (map :account ; gets account numbers out of maps
      [{:account 123, :type "PK", :end "01.01.2013", ...}, ...])) ; your accounts

但是,示例中的{}表示法({1, 123, 2, 456 etc})表明您可能对地图更感兴趣。在这种情况下,您可以使用zipmap

(zipmap ; makes a map with keys from first sequence to values from the second
 (map inc (range))
 (map :account
      [{:account 123, :type "PK", :end "01.01.2013", ...}, ...]))

答案 1 :(得分:3)

map-indexed将帮助您创建递增的数字序列:

user> (let [f (comp (partial into {})
                    (partial map-indexed #(vector (inc %) (:account %2))))]
        (f [{:account 123, :type "PK", :end "01.01.2013"} {:account 456 :type "GK" :end "01.07.2016"}]))
{1 123, 2 456}