一个仍在学习的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“,”吐“。
而且 - 如果英语不好,请原谅我 - 我用英语问这些问题并不常见。
答案 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}