在Clojure中将地图列表转换为地图
我是Clojure和编程新手,我想知道如何着手解决这个问题 我已导出以下地图列表在Clojure中将地图列表转换为地图,clojure,Clojure,我是Clojure和编程新手,我想知道如何着手解决这个问题 我已导出以下地图列表 ({:name "Bob", :occupation "Senior salesman", :work-department "Sales"} {:name "Sharon", :occupation "Executive", :work-department "Sales"}
({:name "Bob",
:occupation "Senior salesman",
:work-department "Sales"}
{:name "Sharon",
:occupation "Executive",
:work-department "Sales"}
{:name "Donald",
:occupation "Customer Support agent",
:work-department "Client services"}
{:name "Catherine",
:occupation "Technical Lead",
:work-department "Engineering"})
我将如何将此从地图列表转换为以下样式的地图
{:sales
{:name "Bob"
:occupation "Senior salesman"}
:sales
{:name "Sharon"
:occupation "Executive"}
:client-services
{:name "Donald"
:occupation "Customer Support agent"}
:engineering
{:name "Catherine"
:occupation "Technical Lead"}}
感谢您的帮助您可能会发现功能分组在这种情况下很有用。假设我们将您的地图列表定义为“以前” 然后,group by将生成从键到具有该键的项目列表的映射:
> (group-by :work-department before)
{"Sales"
[{:name "Bob",
:occupation "Senior salesman",
:work-department "Sales"}
{:name "Sharon",
:occupation "Executive",
:work-department "Sales"}],
"Client services"
[{:name "Donald",
:occupation "Customer Support agent",
:work-department "Client services"}],
"Engineering"
[{:name "Catherine",
:occupation "Technical Lead",
:work-department "Engineering"}]}
如果您希望有一个平面结构输出,您可以这样变换每个条目:
> (map (fn [e] [(:work-department e) (dissoc e :work-department)]) before)
(["Sales" {:name "Bob", :occupation "Senior salesman"}]
["Sales" {:name "Sharon", :occupation "Executive"}]
["Client services"
{:name "Donald", :occupation "Customer Support agent"}]
["Engineering" {:name "Catherine", :occupation "Technical Lead"}])
请添加您尝试过的代码以及失败的原因(例如错误、堆栈跟踪、日志等),以便我们对其进行改进。现在,您想要的结果显示一个包含奇数个元素的映射,这是不可能的。如果要将其中两个键/VAL分解为它们自己的映射,则该映射本身也需要一个键。例如,
{:工作部门“xxx”:员工{:姓名“xxx”:职业“xxx”}
请更新您的问题,以显示示例输入所需的完整准确输出(编号xxx:-),感谢您的友好回复。我已经用要求的信息修改了我的问题,现在地图上有两次:sales
。如果您希望得到帮助,请花时间关注问题,并首先尝试您的代码示例,这样它们就不会包含明显的错误谢谢您的反馈。我将努力提高我的问题和质量。请注意两次:销售-是否有办法满足数据包含相同值的情况?谢谢Markc!这太好了,我真的很感谢你在这件事上的帮助
> (map (fn [e] [(:work-department e) (dissoc e :work-department)]) before)
(["Sales" {:name "Bob", :occupation "Senior salesman"}]
["Sales" {:name "Sharon", :occupation "Executive"}]
["Client services"
{:name "Donald", :occupation "Customer Support agent"}]
["Engineering" {:name "Catherine", :occupation "Technical Lead"}])