2013-07-20 51 views
1

我开始学习F#,并且我正在努力弄清楚简单的事情。我有一个我想转换为F#的Python代码。问题是Python中字典的初始化,我不知道如何转换为F#。F#中的字典初始化类似于Python

dicoOfItems = {'aaaaa': {'a': 2.5, 'b': 3.5, 'c': 3.0, 'd': 3.5, 'e': 2.5,'f': 3.0}, 'bbbbb': {'a': 3.0, 'b': 3.5}} 

然后有一个功能

def sim_distance(prefs,person1,person2): 
si={} // I want the same in F# 
    for item in prefs[person1]: 
    if item in prefs[person2]: si[item]=1 

// do stuff 
return something 

这个函数被调用,例如下面的参数

sim_distance(dicoOfItems, 'aaaaa', 'bbbbb') 

我的问题是我怎么能获得一个做在F#相同新词典si

Python if ... in .. list语法我尝试使用f#Seq.exists但后来我不知道如何初始化新的字典。

我玩过Seq.choose,Seq.map但没有成功。

+0

不太确定你想要做什么,但你可以尝试使用'dict [('a',2.5);('b',3.5)...] ' –

+0

我正在使用字典。我想要做的是和Python中的一样。 For循环和比较if .. In ..获得一个新的字典'si' –

回答

5
let test = dict [for x in [1..10] do 
        if x%2 = 0 then 
         yield x.ToString(),x] //note that this is returning a (string*int) 
printfn "%d" test.["5"] 

正如约翰·帕尔默指出,适当的方式来创建在F#单个语句的字典是使用dict函数,它接受一个序列类型并将其转换为一个字典。

dict;; 
val it : (seq<'a * 'b> -> IDictionary<'a,'b>) when 'a : equality = <fun:[email protected]> 

注意

[for x in [1..10] do 
    if x%2 = 0 then 
     yield x.ToString(),x] 

创建一个列表([]是列表表示和列表是这样的序列),然后该列表是参数来将其转换成一个字典功能dict。然后

你的功能应该是这样的:

let sim_distance prefs person1 person2 = 
    let si=dict [for item in prefs.[person1] do 
        if prefs.[person2].Contains(item) then 
         yield item,1] 
    something 
+0

基于我最初的例子。会是这样的吗? let si = [for pref的项目[person1]做 如果Seq.exists(fun elem - > elem = item)prefs。[person2]然后 yield item,1] –

+0

如果你想让它成为一本字典,需要将它作为参数传递给'dict'函数,但是,这是正确的想法。 'item'将成为关键字,'1'将被转换为字典后成为值。 – mydogisbox

+0

@ThomasJaskula我添加了一个直接翻译到我的文章。 – mydogisbox

3

所以我认为你要使用的System.Collections.Generic.Dictionary<_,_>这是可变的,而不是F#dict这是不可改变的。你可以这样使用它:

let sim_distance(prefs:System.Collections.Generic.IDictionary<_,_>,person1,person2) = 
    let si= System.Collections.Generic.Dictionary<_,_>() 

    for KeyValue(k,v) in prefs.[person1] do 
    for KeyValue(k2,v2) in prefs.[person2] do if k2=k then si.Add(k,1) 
+0

它显示我在第二行的错误,在这种情况下“意外的关键字'让'或'使用'绑定。我的问题也是如何在函数中定义它而不是在绑定中。在函数中,if ... in构造似乎不起作用。 –

+0

@ThomasJaskula - 还没有意识到第二行是我刚刚入侵的'if'包含使用循环。 –

+0

谢谢。我今天会试试这个。 –