我正在学习 Clojure,并想了解更多关于序列的信息。我有一个现实生活中的问题,我已将其简化为一般问题,但我不知道它是否有规范名称。希望下面的示例可以清楚地说明。
假设我有两个向量,src
并且dst
. 向量中的项目src
本身就是向量,我需要将每个向量中的每个项目映射到dst
.
(def src [ ["a1" "a2" "a3"] ["b1" "b2"] ["c1" "c2" "c3" "c4"] ])
(def dst [ "a" "b" "c" ])
我想制作以下地图:
{ :a1 "a", :a2 "a", :a3 "a", :b1 "b", :b2 "b", :c1 "c", :c2 "c", :c3 "c", :c4 "c" }
我可以在 Python 中很好地做到这一点,但 Clojure 的做法对我来说并不清楚。对于这个问题,我可以只构建一个地图,但我希望能够以一种通用的方式来完成,而不仅仅是针对这个实例。
在 Python 中,这将是:
src = [['a1', 'a2', 'a3'], ['b1', 'b2'], ['c1', 'c2', 'c3', 'c4']]
dst = ['a', 'b', 'c']
result = {}
for (s, d) in zip(src, dst):
for x in s:
result[x] = d
在 Clojure 中,我尝试从以下内容开始:
(interleave src dst)
;=> (["a1" "a2"] "a" ["b1" "b2" "b3"] "b" ["c1"] "c")
所以我已经展平了向量,但我不知道如何遍历映射键并选择值。
此外,zipmap
它本身并不会让我走得太远:
(zipmap src (map keyword dst))
;=> {["c1"] :c, ["b1" "b2" "b3"] :b, ["a1" "a2"] :a}
;bogus result
现在我需要翻转映射键和值,并且仍然进行迭代。
我也没有成功构建for
表达式:
(for [s src] (zipmap s dst)))
;=> ({"a2" "b", "a1" "a"} {"b3" "c", "b2" "b", "b1" "a"} {"c1" "a"})
;bogus result
我正在通过将两个向量配对来解决这个问题,但我似乎无法将向量中的src
向量定位到适当的位置,以便我可以简单地zipmap
将它们中的每一个与dst
.
我怀疑答案真的很明显,但我的大脑仍然无法正常工作。也许在某个地方有一个into {}
和/或assoc
。
任何指针?如果您有兴趣,我提到的现实问题是从 RNA 密码子映射到氨基酸。