首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一个标准的函数,它接受一个dict和一个键列表,并返回相应的键列表?

有没有一个标准的函数,它接受一个dict和一个键列表,并返回相应的键列表?
EN

Stack Overflow用户
提问于 2013-05-29 06:15:00
回答 5查看 2.2K关注 0票数 9

我在找类似于select-keys的东西

代码语言:javascript
复制
(desired-fn {:a 1, :b 2, :c 3, :d 4} [:a :d])
;= [1 4]

;; N.B. the order of the keys in the argument seq is preserved
(= (desired-fn (array-map :a 1, :b 2, :c 3, :d 4)
               [:b :c])
   (desired-fn (array-map :d 4, :c 3, :a 1, :b 2)
               [:b :c]))
;= true

它的实现并不是特别困难,尽管我还没有尝试想出一个好的名字:

代码语言:javascript
复制
(defn select-values-corresponding-to-keys [m ks]
  (for [k ks]
    (get m k)))

我是不是不知道有没有一个标准函数可以完全满足这个需求呢?如果没有,其他语言-e.g.,python.ruby.haskell--有没有这个函数的名字?

EN

回答 5

Stack Overflow用户

发布于 2013-05-29 06:54:08

映射是对其键进行操作的函数:

代码语言:javascript
复制
({:a 1, :b 2} :a)
;=> 1

(map {:a 1, :b 2, :c 3, :d 4} [:a :d])
;=> (1 4)

(= (map (array-map :a 1, :b 2, :c 3, :d 4)
           [:b :c])
   (map (array-map :d 4, :c 3, :a 1, :b 2)
           [:b :c]))
;=> true

如果你想要矢量形式的结果,只需使用vecinto [] ...,或者用mapv替换map

票数 12
EN

Stack Overflow用户

发布于 2013-05-29 12:27:21

关键字本身就是函数(它们实现IFn),它们可以在映射中查找自己并返回值,因此一种选择是使用juxt

代码语言:javascript
复制
(def keys-to-vals (juxt :b :c))
(= (keys-to-vals {:a 1, :b 2, :c 3, :d 4})
   (keys-to-vals {:d 4, :c 3, :a 1, :b 2}))

所以基本上你想要的fn现在变成了:

代码语言:javascript
复制
(defn select-vals [map keys] ((apply juxt keys) map))
票数 3
EN

Stack Overflow用户

发布于 2013-05-29 15:09:41

map是您要查找的函数:

代码语言:javascript
复制
(map {:a 1 :b 2 :c 3} [:a :c])
=> (1 3)

这之所以有效,是因为哈希图本身作为一个函数(即实现clojure.lang.IFn)工作,该函数返回给它的任何键的值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16802381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档