计数有每一个字母开头的单词数

问题描述 投票:3回答:1

Think 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_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
julia
1个回答
5
投票

你有循环的错误的顺序(即外环应重复字母)。你能解决这个问题是这样的(我还简化了代码位):

for letter in "abcdef"
    letter_count = count(x -> letter in x, eachline("words.txt"))
    println("$letter has $letter_count")
end

然而迭代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

你也可以使用这样的(我报告这是我发现这是一个有趣的解决方案)广播达到预期的效果:

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

编辑:

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),你应该始终密切开流)。但是,至少对我来说,这不是一个很干净的做法,所以我不想推荐它摆在首位。

© www.soinside.com 2019 - 2024. All rights reserved.