1

私は F# を学び始めていますが、単純なことを理解するのに苦労しています。F# に変換したい Python コードがあります。問題は、Python での辞書の初期化であり、F# に変換する方法がよくわかりません。

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')

私の質問は、新しい辞書siを取得するために F# で同じことを行うにはどうすればよいですか?

Python if .. in .. list 構文を f# Seq.exists で使用しようとしましたが、新しい辞書を初期化する方法がわかりませんでした。

Seq.choose、Seq.map で遊んだことがありますが、成功しませんでした。

4

2 に答える 2

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"]

John Palmer が指摘したように、F# の 1 つのステートメントでディクショナリを作成する適切な方法dictは、シーケンス型を取得してそれをディクショナリに変換する関数を使用することです。

dict;;
val it : (seq<'a * 'b> -> IDictionary<'a,'b>) when 'a : equality = <fun:clo@3>

ご了承ください

[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
于 2013-07-21T00:55:22.850 に答える