【问题标题】:Clojure: Rename and select keys from map with one iterationClojure:一次迭代从地图中重命名和选择键
【发布时间】:2015-05-12 22:10:05
【问题描述】:

在 Clojure 中,我想从地图中重命名键和选择键。 简单的做法是:

(-> m
    (rename-keys new-names)
    (select-keys (vals new-names)))

但这会在整个地图上重复两次。 有没有办法通过一次迭代来做到这一点?

【问题讨论】:

  • 如果你的新名字很小但 m 很大,你可以先选择 (**keys** new-names) 然后重命名(小)结果
  • 如果您不需要将结果作为地图而只是一个函数,您也可以不进行迭代:(comp m new-names-to-old-names-map)
  • 你为什么不这样做呢? {:new-key-1 (my-map :old-key-1) :new-key-2 (my-map :old-key-2) :new-key-3 (my-map :old-key-3)}

标签: clojure


【解决方案1】:

当然,有一种方法可以通过一次迭代来完成。

您可以使用reduce-kv function

(reduce-kv #(assoc %1 %3 (get m %2)) {} new-names)

或者只是一个 for 循环:

(into {} (for [[k v] new-names] [v (get m k)]))

如果您想要一段非常简单的代码,您可以使用来自algo.generic libraryfmap function

(fmap m (map-invert new-names))

【讨论】:

    猜你喜欢
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多