gpt4 book ai didi

clojure - Clojure 中以最大值分割向量——更好的方法?

转载 作者:行者123 更新时间:2023-12-03 00:06:51 25 4
gpt4 key购买 nike

新手问题:

如何在其中包含最大值的第一个实例处分割数字向量?

所以,从这个[1 2 3 4 5 4 3 2 1] ,得到[1 2 3 4 5] [4 3 2 1] .

我的做法似乎过于复杂:

(def up5 [1 2 3 4 5 4 3 2 1])
(split-at (inc (.indexOf up5 (apply max up5))) up5) ; => [1 2 3 4 5] [4 3 2 1]

是不是感觉有点尴尬?例如使用定义的向量三次。我们是否需要使用Java来获取索引?

什么是更好、更惯用或更高效的方法?

谢谢。

最佳答案

替代变体(只是为了好玩):

  • 您生成具有分割位置(项目索引 + 1)和项目本身的元组序列
  • 使用 max-key 查找包含最大项的元组
  • 在所需索引处拆分集合(元组中的第一项)

    (defn split-at-max [items]
    (->> items
    (map vector (rest (range)))
    (apply max-key second)
    first
    (#(split-at % items))))

    user> (split-at-max [-1 20 3 4 1 3 5 101 4 2 6 4])
    [(-1 20 3 4 1 3 5 101) (4 2 6 4)]

此外,您可以轻松地将其修改为与任意标准一起使用来估计值。

(defn split-at-max [items & {identity-fn :by :or {identity-fn identity}}]
(->> items
(map vector (rest (range)))
(apply max-key (comp identity-fn second))
first
(#(split-at % items))))

按身份划分的最大值:

user> (split-at-max [-1 20 3 4 1 3 5 101 4 2 6 4])
[(-1 20 3 4 1 3 5 101) (4 2 6 4)]

最大尺寸:

user> (split-at-max ["i" "wanna" "rock'n'roll" "all" "night" 
"and" "party" "every" "day"]
:by count)
[("i" "wanna" "rock'n'roll") ("all" "night" "and" "party" "every" "day")]

或者通过一些外部值,例如:

user> (split-at-max [:a :b :c :d] :by {:a 0 :b 121 :c 2 :d -100})
[(:a :b) (:c :d)]

所以对我来说,它似乎更实用(并且对于更多的“clojure 方式”),尽管可能不是最高效的。

关于clojure - Clojure 中以最大值分割向量——更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33951747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com