4

次のようなリストがある場合...

(def test [[1 2 3]
           [4 5 6]
           [7 8 9]])

そして、5のインデックス((1,1)になります)が必要です。どうすればよいですか?そう (5 テストを見つける) = (1,1)

4

5 に答える 5

2

その操作のための組み込み関数はないと思いますが、書くのは難しくないはずです。

ネストされたベクトルを単一のリストにフラット化し、検索して結果のインデックスを取得し、最初のネストされたベクトルの長さを使用して x 座標と y 座標を分割できます。

(defn find2d [data item]
  (let [n (count (first data))
        i (.indexOf (flatten data) item)]
    (if (pos? i)
      (list (quot i n) (mod i n)))))

(find2d data 5) ;=> (1 1)
于 2013-09-22T02:45:22.800 に答える
0

これはあなたが望むことをするはずです:

(defn indexof-2D [item mat]
  (letfn [(index-of-row 
           [x]
           (first (keep-indexed #(if (= item %2) %1) x)))]
    (->> mat
         (map-indexed #(vector %1 (index-of-row %2)))
         (filter last)
         first)))

あなたのユースケースが何であるかはわかりませんが、一般的にインデックスを使用して clojure の問題を解決することは、おそらく間違った角度から問題に取り組んでいることを示しています。上記の関数は、高性能の行列計算には使用しないでください。

于 2013-09-22T03:08:20.540 に答える