【问题标题】:Given a clojure vector, iteratively remove 1 element给定一个 clojure 向量,迭代删除 1 个元素
【发布时间】:2013-05-05 05:57:24
【问题描述】:

我正在尝试构建一组函数来相互比较句子。所以我写了一个名为split-to-sentences 的函数,它接受这样的输入:

"This is a sentence. And so is this. And this one too."

然后返回:

["This is a sentence" "And so is this" "And this one too."]

我正在努力解决的是如何遍历这个向量并获取不是当前值的项目。我试着用dropremove 打听,但还没有完全弄清楚。

我想我可以做的一件事是在循环中使用firstrest,并在rest 的输出中使用conj 的前一个值。

【问题讨论】:

  • 不是当前值的项目是什么意思?
  • 向量中不是“当前”的元素

标签: clojure


【解决方案1】:
(remove #{current-value} sentences-vector)

【讨论】:

  • 这是我正在使用的解决方案。非常感谢!
【解决方案2】:

只需使用过滤器:

(filter #(not= current-value %) sentences-vector)

【讨论】:

    【解决方案3】:

    我相信你可能想要这样的功能:

    (defn without-each [x]
      (map (fn [i] (concat (subvec x 0 i) (subvec x (inc i))))
           (range (count x))))
    

    像这样使用它:

    >>> (def x ["foo" "bar" "baz"])
    >>> (without-each x)
    ==> (("bar" "baz") ("foo" "baz") ("foo" "bar"))
    

    返回的元素是惰性连接的,这就是它们不是向量的原因。这是可取的,因为真正的向量连接(例如(进入 a b))是 O(n)。

    因为 subvec 使用与原始序列共享,所以不应该使用过多的内存。

    【讨论】:

      【解决方案4】:

      诀窍是将您的句子两次传递给reduce 函数...

      (def sentences ["abcd" "efg" "hijk" "lmnop" "qrs" "tuv" "wx" "y&z"])
      
      (reduce
        (fn [[prev [curr & foll]] _]
          (let [aren't-current-value (concat prev foll)]
            (println aren't-current-value) ;use it here
            [(conj prev curr) foll]))
        [[] sentences]
        sentences)
      

      ...一次查看以下内容,一次进行迭代。

      【讨论】:

      • 在第 4 行更改为 [prev [curr & foll]]
      【解决方案5】:

      您可以考虑使用subvecpop,因为它们在向量上的运算速度都非常快。

      【讨论】:

        猜你喜欢
        • 2015-04-21
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 1970-01-01
        • 2017-10-24
        • 2016-08-20
        相关资源
        最近更新 更多