2024年Clojure调查中分享您的想法!

欢迎!请参阅关于页面获取更多关于如何使用此页面的信息。

0
Collections

嗨!
我是一个Clojure的新手,我在通过数据结构循环访问数据时遇到困难。

我有一个看起来像这样的列表: (list1)
([1 (item1 item2 item3)]
[2 (item21 item22 item33)])

还有一个看起来像这样的: (list2)
([1 (rec1 rec2 rec3)]
[2 (rec21 rec22 rec33)])

最后一个是这样的: (list3)
([1 (1 1 3)]
[2 (2 2 3)])

现在,我必须遍历list3,并创建一个新的集合,将list3中的第一个1替换为"item1",将list3中的第二个1替换为"rec1",... 对于list3中的所有向量都这样处理...

这三个列表具有精确相同的记录数。

我的第三个列表应该是这样的
([1 (item1 rec1 3)]
[2 (item21 rec22 3])

有什么想法如何继续吗?

1 回答

0

选定
 
最佳答案

嘿,又来了!

您的问题是规定性的。有一个假设,您必须以 ([1 (item1 item2 item3)] [2 (item21 item22 item33)]) 的形式存储数据,而且根据我昨天看到您的编码,您可能选择了不合适的数据结构(我自己可能使用了 [{:id 1 :item shoes :price 14.96}, {:id 2 :item milk :price 1.98}])。方法根据 id 是否是真实的唯一标识每个条目而有所不同。我将尝试使用 clojure.set 函数(https://clojure.github.io/clojure/clojure.set-api.html),因为它们适合此类操作,您确实想要使用 clojure.set/joinclojure.set/select 然后是 clojure.set/project

除此之外,我认为您要求的转换是 map,这是一个流行的函数,您可以在 https://docs.clojure.org/clojure.core/map 上看到文档。

(map
 (fn [x y z] [(first x) 
              (list (first (second x)) 
                    (first (second y)) 
                    (nth (second z) 2))])
 list1
 list2
 list3)

这并不完全符合您的要求,我无法理解为什么您选择 rec11,而 rec222

我没有选择数据结构,它的方式就是在这些说明中给出的。
为了回答这个问题,第三个列表就像是列表 1 & 2 的合并。
因此,对于 list3 中的第一个记录
1 = 记录的 id
(1 1 3) = 1: 第一个列表中记录的 id | 1: 第二个列表中记录的 id | 3: 不必在新集合中改变的随机数。
好吧。常见的建议是将这个问题视为构建一个包含所有三个现有列表元素的新第 4 个列表。

仍然应该是你要求的 map,你将需要调整所应用的函数,直到它做到你想要的事情。
非常感谢... 在适应和多次测试后,我终于搞明白了。
感谢您的帮助! :)
...