实施计数器

时间:2012-06-19 12:58:22

标签: for-loop clojure

我想迭代一个集合,同时还要维护一个反击

(for [x (range 10) y (inc 0)] [x y] )

我希望'y'代表计数器,因此对于每个元素,输出是([0 0] [1 1] [2 2] ...)。我该怎么做?

5 个答案:

答案 0 :(得分:12)

您可以使用clojure.contrib.seq中的indexed。例如:

(indexed '(a b c d))  =>  ([0 a] [1 b] [2 c] [3 d])

您也可以使用map-indexed。例如:

(map-indexed vector "foobar")  =>  ([0 \f] [1 \o] [2 \o] [3 \b] [4 \a] [5 \r])

答案 1 :(得分:6)

使用map-indexed作为Simeon建议。在for上下文中,使用解构可以方便地访问计数器和集合元素:

(for [ [y x] (map-indexed vector (range 10) ) ] [x y] )

> ([0 0] [1 1] [2 2] [3 3] [4 4] [5 5] [6 6] [7 7] [8 8] [9 9])

答案 2 :(得分:2)

我认为如果这个问题仍然没有被标记为“已回答”,那么可能还有其他一些问题,也许可以灵活定义自己的计数器。

我同意其他人的意见,对于你提出的具体问题,map-indexed是要走的路。但是,如果您坚持使用for,我建议使用以下内容:

(for [[x y] (map vector (range 10) (iterate inc 0))]
  [x y])

Rafal有一个非常相似的答案,除了计数器总是从零开始并递增1.在我的版本中你可以根据需要定义你的计数器。例如,通过将上述(iterate inc 0)更改为(iterate #(+ 2 %) 10),您可以使用从10开始并以2为增量的计数器。

答案 3 :(得分:1)

(keep-indexed (fn [i el][el i]) (range 10))

(keep-indexed #(vec [%2 %1]) (range 10))
(keep-indexed #(identity [%2 %1]) (range 10))
;([0 0] [1 1] [2 2] [3 3] [4 4] [5 5] [6 6] [7 7] [8 8] [9 9])

答案 4 :(得分:1)

另外,请记住在Clojure中使用索引通常是代码味道。