2014-04-19 110 views
1

我有一个看起来像这样的列表:如何在clojure中将hashmaps列表转换为一个hasmap?

({:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10}) 

,我想将其转换为HashMap的:

{:2 9 :5 8 :6 10} 

名单是从MySQL数据库中创建的,我不知道我能否从DATAS数据库中的其他格式,这将更容易转换为一个hashmap,我使用了java.jdbc查询功能。

任何人都可以帮助我吗?

回答

7
(fn [data] (into {} (map (juxt :course :mark) data))) 

(list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10}) 

产生

{2 9, 5 8, 6 10} 

keyword函数不接受数字作为论据,所以我不认为你可以得到相当是你所期待的。但是数字无论如何都是关键字。


错!正如其他人所表明的,Clojure接受数字字符串作为关键字。我们可以适应上述使用这样的:

(fn [data] (into {} (map (juxt (comp keyword str :course) :mark) data))) 

(list {:course 2, :mark 9} {:course 5, :mark 8} {:course 6, :mark 10}) 

产生

{:2 9, :5 8, :6 10} 

但是,正如我已经说过了,我认为这是不必要的风险。为什么不使用数字作为键?


而且使用数字(字符串)关键字:

reader doc about symbols

  • 符号与非数字字符开头...
  • 关键词都喜欢符号除外:...(进一步限制)
+0

Neat solution._ – jforberg

+1

'juxt'在这里是个好主意! (fn [data](into {}(map(juxt#(关键字(str(:course%))):mark)data))为了得到所需的输出结果,下面是解决方案以获得确切的请求输出: )' – leontalbot

+1

@leontalbot我做得有点不同,Leon。我仍然感到惊讶的是数字字符串关键字被接受。无论如何,带关键字作为函数的juxt具有很强的表现力。如果你在玩高尔夫球代码:还是一个比我更长的角色,嘿嘿,另一个表达内在功能的方式是'#( - >%:course str keyword)'。 – Thumbnail

1

另一种变体。 (比缩略图的可能不太有效的,如果你有大量的数据。)

(zipmap (map (comp keyword str :course) data) 
     (map :mark data)) 

其中data是在问题中指定的格式。

+0

...或者(应用zipmap(map#(map%data)[(comp keyword str:course):mark]))'' – Thumbnail

相关问题