2013-07-20 23 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

謝謝。我今天會試試這個。 –