【问题标题】:Clojure: Increment first element of every vector in listClojure:增加列表中每个向量的第一个元素
【发布时间】:2021-03-05 17:35:05
【问题描述】:

我有一个这样的向量列表:

([4 0] [4 2] [2 1] [4 1])

如何将每个向量的第一个元素增加某个值 X?

想要的输出:

([5 0] [5 2] [3 1] [5 1])

这是我目前的方法,但我认为我可以更简单:

(defn shiftVector [oldVector number]
   (map vector
      (map #(+ (first %) number) oldVector )
      (map  #(second %) oldVector))
)

【问题讨论】:

    标签: vector clojure


    【解决方案1】:

    由于向量在它们的索引上是关联的,可能最简单的方法是:

    (defn shift-vector [v n]
      (map #(update % 0 + n) v))
    
    (shift-vector [[4 0] [4 2] [2 1] [4 1]] 1)
    ;=> ([5 0] [5 2] [3 1] [5 1])
    

    这适用于列表中的任何长度向量(空向量除外,但无论如何您都无法增加它们)。

    【讨论】:

      【解决方案2】:

      提取第一个元素,递增它,然后将所有内容放回一个新向量中:

      (defn inc-first [col]
        (map #(into [] (flatten (conj [] (inc (first %)) (rest %)))) col))
      

      测试:

      user=> (inc-first '([4 0] [4 2] [2 1] [4 1]))
      ([5 0] [5 2] [3 1] [5 1])
      user=> (inc-first '([4 0 0] [4 2 2] [2 1 1] [4 1 1]))
      ([5 0 0] [5 2 2] [3 1 1] [5 1 1])
      user=> (inc-first '([4 4 4 4] [4 2 2 2] [2 2 3 4] [4 1 0 -1]))
      ([5 4 4 4] [5 2 2 2] [3 2 3 4] [5 1 0 -1])
      

      【讨论】:

      • 展平几乎总是不是你想要的,因为它会完全展平其论点中的所有结构。您的核心思想的一个更​​简单的版本是: (map #(into [(inc (first %))] (rest %)) [[4 0] [4 2] [2 1] [4 1]]) ;=> ([5 0] [5 2] [3 1] [5 1])
      • @SeanCorfield:非常感谢。我从未见过以这种方式使用into。感谢您向我展示了另一种更好的方法。 :-)
      【解决方案3】:

      使用map

      ;this solution works only for vectors of size 2
      
      (defn inc-lst [lst x]
        (map (fn [e] (vector (+ (first e) x) (second e))) 
        lst))
      
      (inc-lst '([4 0] [4 2] [2 1] [4 1]) 1)
      
      ;more general solution, works for vectors of size >= 1
      
      (defn inc-lst2 [lst x]
        (map (fn [e] (apply vector (+ (first e) x) (rest e))) 
        lst))
      
      (inc-lst2 '([4 0 0] [4 2 2] [2 1 1] [4 1 1]) 1)
      (inc-lst2 '([4] [4] [2] [4]) 1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        相关资源
        最近更新 更多