从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
你有循环的错误的顺序(即外环应重复字母)。你能解决这个问题是这样的(我还简化了代码位):
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)
,你应该始终密切开流)。但是,至少对我来说,这不是一个很干净的做法,所以我不想推荐它摆在首位。