1

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

我曾经学过德尔福,它会在那里

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”、“repeatedly”、“repeat”、“iterate”、“进口”、“啜饮”、“吐口水”。

并且 - 如果有任何不好的英语,请原谅 - 我不经常用英语问这样的问题。

4

2 回答 2

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", ...}, ...]))
于 2012-08-30T07:38:42.943 回答
2

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}
于 2012-08-30T13:12:51.417 回答