clojure - 在 'for' 内使用 'let' 返回 HashMap 列表

标签 clojure

抱歉这个标题不好,因为我不知道如何用 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/

相关文章:

Clojure `defn` 参数是否带括号

clojure - 如何获得 clojure 中两个整数之间的排序集中的数字序列?

clojure - Clojure 常量的约定、样式和用法?

clojure - Clojure 蹦床的奇怪行为

java - 从 Clojure 导入 Java 类

clojure - 从数字创建关键字

syntax - 可以使用 Clojure/Lisp 宏来实现此 lambda 语法吗?

clojure - 如何从 git 存储库加载最新的 Clojure 库

ide - 在 Windows 7 中运行 Clojure Box

map - clojure map 功能急切?