gpt4 book ai didi

clojure - 在 Clojure 中将字符串转换为嵌套映射

转载 作者:太空宇宙 更新时间:2023-11-03 18:52:14 24 4
gpt4 key购买 nike

我有一个包含一些文本的文件,例如:

1|apple|sweet
2|coffee|bitter
3|gitpush|relief

我想使用 map 处理此输入。在 Java 或 Python 中,我会制作一个嵌套 map ,如下所示:

{1: {thing: apple, taste: sweet},
2: {thing: coffee, taste: bitter},
3: {thing: gitpush, taste: relief}}

甚至 map 中的列表,如:

{1: [apple, sweet],
2: [coffee, bitter],
3: [grape, sour]}

最终目标是使用第一列作为键高效地访问最后两列的数据。我想在 Clojure 中做这个,我是新手。到目前为止,我已经成功地使用以下代码创建了一个 map 列表:

(def cust_map (map (fn [[id name taste]] 
(hash-map :id (Integer/parseInt id)
:name name
:taste taste ))
(map #(str/split % #"\|") (line-seq (clojure.java.io/reader path)))))

我明白了,但这不是我想要的。

({1, apple, sweet},
{2, coffee, bitter},
{3, gitpush, relief})

如果您能告诉我如何在 Clojure 中实现最高效的嵌套映射和映射内列表,那就太好了。谢谢!

最佳答案

当您使用 hash-map 构建 map 时,参数是替代键和值。例如:

(hash-map :a 0 :b 1)
=> {:b 1, :a 0}

据我所知,你想要一个唯一的键,整数,它映射到一个复合对象,一个映射:

(hash-map 0 {:thing "apple" :taste "sweet"})

此外,您不希望调用 map,这会产生一系列 map 。您想要构建单个 HashMap 。尝试使用 reduce :

(reduce (fn [map [id name taste]]
(merge map
(hash-map (Integer/parseInt id)
{:name name :taste taste})))
{}
'(("1" "b" "c")
("2" "d" "e")))

---编辑

完整的测试程序如下:

(import '(java.io BufferedReader StringReader))

(def test-input (line-seq
(BufferedReader.
(StringReader.
"1|John Smith|123 Here Street|456-4567
2|Sue Jones|43 Rose Court Street|345-7867
3|Fan Yuhong|165 Happy Lane|345-4533"))))

(def a-map
(reduce
(fn [map [id name address phone]]
(merge map
(hash-map (Integer/parseInt id)
{:name name :address address :phone phone})))
{}
(map #(clojure.string/split % #"\|") test-input)))

a-map
=> {1 {:name "John Smith", :address "123 Here Street", :phone "456-4567"}, 2 {:name "Sue Jones", :address "43 Rose Court Street", :phone "345-7867"}, 3 {:name "Fan Yuhong", :address "165 Happy Lane", :phone "345-4533"}}

关于clojure - 在 Clojure 中将字符串转换为嵌套映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50663848/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com