コレクションを反復処理し、同時にカウンターexも維持したい
(for [x (range 10) y (inc 0)] [x y] )
「y」でカウンターを表したいので、すべての要素の出力は ( [0 0] [ 1 1] [2 2]...) です。それ、どうやったら出来るの?
indexed
からご利用いただけますclojure.contrib.seq
。例:
(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])
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])
この質問がまだ「回答済み」としてマークされていない場合、探しているものが他にある可能性があり、おそらくそれは独自のカウンターを定義する柔軟性です。
あなたが概説した特定の問題について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 ずつ増加するカウンターを使用できます。
また、Clojure でインデックスを使用することは、一般的にコードのにおいがすることを覚えておいてください。
(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])