Clojure 2024状态调查!中分享您的想法。

欢迎!请查看关于页面了解有关其如何工作的更多信息。

0投票
集合

嗨!
我是Clojure的初学者,我在处理数据结构中的数据循环时遇到了困难。

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

另一个列表如下:(list2)
([1 (rec1 rec2 rec3)])
\\n[2 (rec21 rec22 rec33)])

最后一个列表是:(list3)
([1 (1 1 3)]
[2 (2 2 3)])

现在,我必须进入list3中并创建一个新集合,其中用"item1"替换列表3中的1,用"rec1"替换列表3中的第二个1... 对于list3中的所有向量都按此类推...

这三个列表有相同数量的记录。

我的第三个列表应该看起来像
([1 (item1 rec1 3)])
\\n[2 (item21 rec22 3)])

有什么想法如何进行吗?

1 答案

0投票

被选中
 
最佳答案

嗨,又来了!

您的问题具有指令性。这里假设您必须将数据存储为([1 (item1 item2 item3)] [2 (item21 item22 item33)])的形式,根据我 yesterday 您的代码上看到的情况,您可能选择了一个不适合的数据结构(我的代码可能使用了[{:id 1 :item shoes :price 14.96}, {:id 2 :item milk :price 1.98}])。处理方法取决于id是否是真实的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)

这并不能给你你要求的确切结果,我无法解释您为什么用rec1代表1而用rec22代表2

我没有选择数据结构,它是在指令中给出的。
为了回答这个问题,第三条列表就像是合并了列表1和2。
所以,对于列表3中的第一个记录
1 = 记录的id
(1 1 3) = 1:第一条列表中记录的id | 1:第二条列表中记录的id | 3:不需要在新的集合中更改的随机数。
好吧。普遍的建议是把这个问题看作是构建一个新的包含所有三个现有列表元素的第4个列表。

仍然应该是您要求的map,您将不得不调整应用函数,直到它完成您想要的操作。
非常感谢...经过适应和多次测试后,我找到了解决方案。
感激帮助!:)
...