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

我的问题是如何在 F# 中做同样的事情来获取新字典si

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# 中的单个语句中创建字典的适当方法是使用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 回答
3

所以我认为你想使用System.Collections.Generic.Dictionary<_,_>可变的而不是dict不可变的 F#。您可以按如下方式使用它:

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)
于 2013-07-21T01:31:43.247 回答