1

私の質問は、コンパイル時にいくつの要素を知らなくても、シーケンスからいくつかの要素を抽出するにはどうすればよいかということです。部分的な使用が思い浮かびましたが、シーケンスではなく要素を引き出すのに苦労していました。

以下のインターリーブによって生成されたシーケンスを実現したいと思いますが、有限数のマップ形式でコーディングする必要はありません。

(def s1 [[:000-00-0000 "TYPE 1" "JACKSON" "FRED"]
         [:000-00-0001 "TYPE 2" "SIMPSON" "HOMER"]
         [:000-00-0002 "TYPE 4" "SMITH" "SUSAN"]])

(interleave (map #(nth % 0 nil) s1) 
            (map #(nth % 2 nil) s1) 
            (map #(nth % 3 nil) s1))

(:000-00-0000 "JACKSON" "FRED" 
 :000-00-0001 "SIMPSON" "HOMER" 
 :000-00-0002 "SMITH" "SUSAN")

私が次のことをしたら

(def cols [0 2 3])

(defn f1
    [s1 col]
    (nth s1 col nil))

(map (partial f1 s1) cols)

私は得る

([:000-00-0000 "TYPE 1" "JACKSON" "FRED"]\
 [:000-00-0002 "TYPE 4" "SMITH" "SUSAN"] nil)

なぜこれが起こっているのか知っていると思います。cols パラメータは、シーケンス内の要素セレクターではなく、シーケンス セレクターのように機能しています。各シーケンスからいくつかの要素を引き出したいと思います。各シーケンスから要素を引き出すにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

1

forとを使用して、これをもう少し簡潔に行うことができますpartition

user> (defn get-cols [s cols] (partition (count cols) (for [ws s c cols] (ws c))))
#'user/get-cols
user> (get-cols [[:000-00-0000 "TYPE 1" "JACKSON" "FRED"]
            [:000-00-0001 "TYPE 2" "SIMPSON" "HOMER"]
            [:000-00-0002 "TYPE 4" "SMITH" "SUSAN"]]
            [0 2 3])
((:000-00-0000 "JACKSON" "FRED") (:000-00-0001 "SIMPSON" "HOMER") (:000-00-0002 "SMITH" "SUSAN"))

これにより、元のグループも保持されます。

于 2012-04-20T14:17:16.743 に答える
1

関数を使用して、次のget-inようにネストされたデータ構造にアクセスできます。

(def cols [0 2 3])

(defn f1 
  [s1 col] 
  (map #(get-in s1 [% col] nil) (range (count s1))))

(apply interleave (map (partial f1 s1) cols))

(:000-00-0000 "JACKSON" "FRED" 
 :000-00-0001 "SIMPSON" "HOMER" 
 :000-00-0002 "SMITH" "SUSAN")
于 2012-04-19T18:26:48.580 に答える
0

これは私がそれを行う方法です:

(apply concat (map (juxt first #(nth % 2) #(nth % 3)) s1))

これは、最初に s1 から中間ベクトルに列を収集し、次にそれらのベクトルを 1 レベル平坦化し、結果につながります。

ここに 2 つの非常に便利な機能があります。

  • 「apply concat」は「flatten」に似ていますが、深さは 1 レベルのみです

  • juxt は、juxt に渡された引数 (関数である必要があります) を A に渡された値に適用し、結果のベクトルを返す関数 A を返します。

于 2012-04-20T17:28:59.270 に答える