Julia 计算包含每个字母的单词数

Julia 计算包含每个字母的单词数,julia,Julia,在书中,我编写了以下代码来计算每个字母表中的单词数: abc = "abcdef" letter_count = 0 fin = open("words.txt") for letter in abc for line in eachline(fin) if letter in line global letter_count += 1 end end println("$letter has $letter_cou

在书中,我编写了以下代码来计算每个字母表中的单词数:

abc = "abcdef"
letter_count = 0
fin = open("words.txt")
for letter in abc
    for line in eachline(fin)
        if letter in line
            global letter_count += 1
        end
    end
    println("$letter has $letter_count")
    global letter_count = 0
end
但是,代码仅统计字母“a”的出现次数。 我不明白为什么这个代码会失败

它返回:

56613 have a
0 have b
0 have c
0 have d
0 have e
0 have f

循环顺序错误(即外部循环应该迭代字母)。您可以这样修复它(我还简化了代码):

但是,像这样迭代words.txt文件会更快:

let counts = zeros(Int, 6)
    for line in eachline("words.txt")
        for (i, letter) in enumerate("abcdef")
            counts[i] += letter in line
        end
    end
    counts
end
您还可以通过这样的广播来达到预期的效果(我报告它,因为我发现它是一个有趣的解决方案):

编辑:

eachline(fin)
eachline(“words.txt”)
之间的区别如下:

  • eachline(“words.txt”)
    每次调用一个新流时都会打开(完成后关闭)
  • eachline(fin)
    使用相同的流,这意味着在迭代的第一个循环完成后,我们就到了流的末尾,流中没有任何内容可以读取
如果在每次迭代后移动到流的开头,则可以保留
eachline(fin)
方法,如下所示:

abc = "abcdef"
letter_count = 0
fin = open("words.txt")
for letter in abc
    for line in eachline(fin)
        if letter in line
            global letter_count += 1
        end
    end
    println("$letter has $letter_count")
    global letter_count = 0
    seekstart(fin)
end
close(fin)

请注意,我已经在代码中添加了一行重要内容(并且还添加了
close(fin)
,因为您应该始终关闭打开的流)。但是,至少对我来说,它不是一种非常干净的方法,因此我不想首先推荐它。

外部循环已经在我的原始代码中迭代字母了。但我发现,如果我将eachline(fin)中line的
修改为eachline中line的
(“words.txt”)
,代码可以工作,但我不明白为什么在前面的方法中失败了。我将在答案中进行注释。
julia> letters = "abcdef"
"abcdef"

julia> sum(in.(hcat(letters...), eachline("words.txt")), dims=1)
1×6 Array{Int64,2}:
 56613  16305  30466  30648  76168  11277
abc = "abcdef"
letter_count = 0
fin = open("words.txt")
for letter in abc
    for line in eachline(fin)
        if letter in line
            global letter_count += 1
        end
    end
    println("$letter has $letter_count")
    global letter_count = 0
    seekstart(fin)
end
close(fin)