6

コレクションを反復処理し、同時にカウンターexも維持したい

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

「y」でカウンターを表したいので、すべての要素の出力は ( [0 0] [ 1 1] [2 2]...) です。それ、どうやったら出来るの?

4

5 に答える 5

12

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])
于 2012-06-19T13:04:57.240 に答える
6

map-indexedSimeon のアドバイスとしてを使用します。コンテキストでは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])
于 2012-06-19T13:52:54.470 に答える
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 ずつ増加するカウンターを使用できます。

于 2012-06-21T06:54:16.170 に答える
1

また、Clojure でインデックスを使用することは、一般的にコードのにおいがすることを覚えておいてください。

于 2012-06-20T15:09:22.137 に答える
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])
于 2012-06-19T16:33:34.360 に答える