F# 显示str的次数
我制作了一个函数来读取.txt文件并将其转换为字符串 从这里我需要帮助收集一个单词的显示次数F# 显示str的次数,f#,F#,我制作了一个函数来读取.txt文件并将其转换为字符串 从这里我需要帮助收集一个单词的显示次数 但是我不确定从这里到哪里去,我们非常感谢您对任何bulletpoints的任何帮助。让我们一步一步地完成这个步骤,为每个位创建一个函数: 将以大写字母开头的单词转换为小写单词,以便所有单词都是小写字母 将字符串拆分为一系列单词: let getWords (s: string) = s.Split(' ') 将“hello world”转换为[“hello”;“world”] 对单词的显示次
但是我不确定从这里到哪里去,我们非常感谢您对任何bulletpoints的任何帮助。让我们一步一步地完成这个步骤,为每个位创建一个函数: 将以大写字母开头的单词转换为小写单词,以便所有单词都是小写字母 将字符串拆分为一系列单词:
let getWords (s: string) =
s.Split(' ')
将“hello world”转换为[“hello”;“world”]
对单词的显示次数进行排序。这个意义上的单词是一系列没有空格或标点符号的字符(!#=等)
第#1部分:用小写字母格式化单词,不使用标点符号:
let isNotPunctuation c =
not (Char.IsPunctuation(c))
let formatWord (s: string) =
let chars =
s.ToLowerInvariant()
|> Seq.filter isNotPunctuation
|> Seq.toArray
new String(chars)
将“你好!”变成“你好”
第2部分:根据单词的格式化版本对单词列表进行分组
let groupWords (words: string seq) =
words
|> Seq.groupBy formatWord
这将返回一个元组,第一部分作为键(formatWord
),第二部分是单词列表
将[“你好”;“世界”;“你好”]
转换为
[("hello", ["hello"; "hello"]);
("world", ["world"])]
从显示的最频繁的单词和较不频繁的单词进行排序
根据第二部分中项目的长度(计数)对列表进行降序排序(第一大)-请参见上面的表示
现在我们只需要清理输出:
let output group =
group
|> Seq.map fst
这将从组中拾取元组的第一部分:
将(“hello”、[“hello”;“hello”])
转换为“hello”
现在我们有了所有的功能,我们可以将它们粘在一条链上:
let s = "some long string with some repeated words again and some other words"
let finished =
s
|> getWords
|> groupWords
|> sortWords
|> output
printfn "%A" finished
//seq ["some"; "words"; "long"; "string"; ...]
然后,让我们一步一步地完成这个步骤,为每个位创建一个函数:
将以大写字母开头的单词转换为小写单词,以便所有单词都是小写字母
将字符串拆分为一系列单词:
let getWords (s: string) =
s.Split(' ')
将“hello world”转换为[“hello”;“world”]
对单词的显示次数进行排序。这个意义上的单词是一系列没有空格或标点符号的字符(!#=等)
第#1部分:用小写字母格式化单词,不使用标点符号:
let isNotPunctuation c =
not (Char.IsPunctuation(c))
let formatWord (s: string) =
let chars =
s.ToLowerInvariant()
|> Seq.filter isNotPunctuation
|> Seq.toArray
new String(chars)
将“你好!”变成“你好”
第2部分:根据单词的格式化版本对单词列表进行分组
let groupWords (words: string seq) =
words
|> Seq.groupBy formatWord
这将返回一个元组,第一部分作为键(formatWord
),第二部分是单词列表
将[“你好”;“世界”;“你好”]
转换为
[("hello", ["hello"; "hello"]);
("world", ["world"])]
从显示的最频繁的单词和较不频繁的单词进行排序
根据第二部分中项目的长度(计数)对列表进行降序排序(第一大)-请参见上面的表示
现在我们只需要清理输出:
let output group =
group
|> Seq.map fst
这将从组中拾取元组的第一部分:
将(“hello”、[“hello”;“hello”])
转换为“hello”
现在我们有了所有的功能,我们可以将它们粘在一条链上:
let s = "some long string with some repeated words again and some other words"
let finished =
s
|> getWords
|> groupWords
|> sortWords
|> output
printfn "%A" finished
//seq ["some"; "words"; "long"; "string"; ...]
这里有另一种使用正则表达式的方法
open System.Text.RegularExpressions
let str = "Some (very) long string with some repeated words again, and some other words, and some punctuation too."
str
|> (Regex @"\W+").Split
|> Seq.choose(fun s -> if s = "" then None else Some (s.ToLower()))
|> Seq.countBy id
|> Seq.sortByDescending snd
这里有另一种使用正则表达式的方法
open System.Text.RegularExpressions
let str = "Some (very) long string with some repeated words again, and some other words, and some punctuation too."
str
|> (Regex @"\W+").Split
|> Seq.choose(fun s -> if s = "" then None else Some (s.ToLower()))
|> Seq.countBy id
|> Seq.sortByDescending snd
我没有投反对票,但投反对票的人很可能投了反对票,因为你要求别人写一些代码,而没有展示你的尝试。看来你对F#还不熟悉,我给出了一个答案,解释了一种解决这个问题的方法,即用函数的方式思考。希望这是一个跳板,能让你用F#解决问题。当F#在.NET上运行时,你有时可以从C#中获得灵感(比如标点符号代码)。啊,好的。我应该这么说。我已经试过了,我可以拆分字符串,这样它就可以打印单词而不是字符,但我想这会让我的帖子变得混乱,因为我写的代码很难看。我也在尝试使用正则表达式。Escape至少可以计算一个单词的出现次数,我看到了这一点:发布你所拥有的东西总是有帮助的。。。当你知道你在寻找什么并且想要计算的时候,这个代码就可以使用了。它可以用来解决你的问题,但如果你想计算所有的实例,我总是希望groupBy来计算。我没有投反对票,但投反对票的人很可能投了反对票,因为你要求别人写一些代码,而没有显示你的尝试。看来你对F#还不熟悉,我给出了一个答案,解释了一种解决这个问题的方法,即用函数的方式思考。希望这是一个跳板,能让你用F#解决问题。当F#在.NET上运行时,你有时可以从C#中获得灵感(比如标点符号代码)。啊,好的。我应该这么说。我已经试过了,我可以拆分字符串,这样它就可以打印单词而不是字符,但我想这会让我的帖子变得混乱,因为我写的代码很难看。我也在尝试使用正则表达式。Escape至少可以计算一个单词的出现次数,我看到了这一点:发布你所拥有的东西总是有帮助的。。。当你知道你在寻找什么并且想要计算的时候,这个代码就可以使用了。它可以用来解决你的问题,但如果你想计算所有的实例,我总是更喜欢用groupBy来计算。哇!非常感谢你,戴夫,我在这里学到了很多!这里有很多我不知道的地方,所以我会再读几遍你的答案。哇!非常感谢你,戴夫,我在这里学到了很多!这里有很多我不知道的地方,所以我会再读几遍你的答案。