【问题标题】:replace vector using map in clojure在clojure中使用map替换向量
【发布时间】:2015-01-25 10:15:33
【问题描述】:

我有一个矢量和一个地图。并且如果是map键想替换向量元素(用值替换键)

user=> (def v [:a :b :c :d])
#'user/v
user=> (def m {:a :k, :c :q} )
#'user/m

user=>  (reduce (fn[x y] (conj x (if (y m) (y m) y))) [] v)
[:k :b :q :d]

有没有更好的办法?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    由于您的输入和输出是相同长度的集合,并且集合项是独立计算的,因此使用mapmapv 进行向量输出会更简单、更惯用。

    (mapv (fn [x] (m x x))
          v)
    

    或者干脆

    (mapv #(m % %) v)
    

    注意(m x x) 类似于(if (contains? m x) (m x) x)

    【讨论】:

    • 小修正:(get m x x) 等于(if (contains? m x) (m x) x)(见(get {:x nil} :x :x))。此外,您可以将函数缩短为#(m % %),因为地图实现了IFn,因此可以直接用于查找。
    • 谢谢,我不知道作为函数的哈希映射也有一个“未找到”的值。
    • hash-map as 函数没有默认值参数。 get 函数可以。
    • 实际上,我对此进行了测试,至少对我有用:({1 1} 2 3) => 3
    【解决方案2】:

    replace 完全符合您的要求:

    user> (replace {:a :x :b :y} [:a :b :c :d :e :f])
    [:x :y :c :d :e :f]
    

    请注意,它可以将向量作为关联集合使用,其中键是索引:

    user> (replace [:a :b :c :d] [0 2 4 3 2 1])
    [:a :c 4 :d :c :b]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-19
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-19
      • 1970-01-01
      相关资源
      最近更新 更多