抱歉这个标题不好,因为我不知道如何用 10 个词来描述。详细信息如下:
我想循环一个格式如下的文件:
a:1 b:2...
我想循环每一行,将所有“k:v”收集到 HashMap 中。
{ a 1, b 2...}
我以“let”形式初始化 HashMap ,然后在let形式中使用“for”循环所有行。 在每个循环步骤中,我使用“assoc”来更新原始 HashMap 。
(let [myhash {}]
(for [line #{"A:1 B:2" "C:3 D:4"}
:let [pairs (clojure.string/split line #"\s")]]
(for [[k v] (map #(clojure.string/split %1 #":") pairs)]
(assoc myhash k (Float. v)))))
但最终我得到了 hash-map 的惰性序列,如下所示:
{ {a 1, b 2...} {x 98 y 99 z 100 ...} }
我现在知道如何“合并”结果,但仍然不明白为什么“let”中的“for”返回 结果列表。
我困惑的是:内部“for”中的“myhash”是否每次都引用“let”形式中声明的“myhash”?如果我确实想要像输出一样的 HashMap 列表,这是 Clojure 中的惯用方式吗?
最佳答案
Clojure“for”是 list comprehension ,所以它创建列表。它不是 for 循环。 另外,您似乎正在尝试修改 myhash,但 Clojure 的数据结构是不可变的。 我解决这个问题的方法是尝试创建一个像 (["a"1] ["b"2] ..) 这样的对列表,并使用 (into {} the-list-of-pairs)
关于clojure - 在 'for' 内使用 'let' 返回 HashMap 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25091257/