4

キーを考えると

:id
:tag
:name

および次の形式で出力を生成する 3 つの遅延シーケンス

(id1 id2 id3 ...)
(name1 name2 name3 ...)
(type1 type2 type3 ...)

次の形式で一連のマップを取得するにはどうすればよいですか

({id: id1 :name name1 :type type1}
{id: id2 :name name2 :type type2}
{id: id3 :name name3 :type type3}
...)

apply、map、assoc などのさまざまな組み合わせを試しましたが、うまくいきませんでした。

4

3 に答える 3

11

必要なのはmap

(map (fn [id name type] {:id id :name name :type type})
     (id1 id2 id3 ...)
     (name1 name2 name3 ...)
     (type1 type2 type3 ...))
于 2012-07-26T20:36:09.927 に答える
6

私の答えは mtyaka の答えと非常に似ていますが、私の意見では、これまでより少し短く、よりモジュール化されています。

(map (fn [& vs] (zipmap [:id :name :type] vs))
     (id1 id2 id3 ...)
     (name1 name2 name3 ...)
     (type1 type2 type3 ...))

ここでzipmapは、固定キー シーケンスと変数値シーケンスを使用してマップを作成しています。これは、「最初のステップ」では(id1 name1 type1)、「2 番目のステップ」では(id2 name2 type2)などになります。

これは、3 つの遅延シーケンスが互いに分離されている場合にのみ機能します。遅延シーケンスのシーケンス、つまり がある場合、次のように、この seq に対して上記を((id1 id2 ...) (name1 name2 ...) (type1 type2 ...))実行する必要があります。apply

(apply map (fn [& vs] (zipmap [:id :name :type] vs))
       ((id1 id2 id3 ...)
        (name1 name2 name3 ...)
        (type1 type2 type3 ..)))

ここでは、遅延シーケンスのシーケンスの先頭にapplyコードを追加するだけで、それが評価される式になります。map (fn [& vs] (zipmap [:id :name :type] vs))つまり、コードの最初のブロックとまったく同じ式になります。

于 2012-07-26T23:35:19.817 に答える
1

私は一緒に行きます:

(map hash-map (repeat :id) seq1 (repeat :name) seq2 (repeat :type) seq3)

seq1、seq2、およびseq3が、後続のキーの値を含む遅延シーケンスであると想定します。

于 2012-07-26T20:41:38.223 に答える