在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
答案 0 :(得分: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)
,因为您应该始终关闭打开的流)。但是,至少对于我来说,这不是一个很干净的方法,因此我不想一开始就推荐它。