Как я понимаю, цель состоит в том, чтобы вычислить средневзвешенное значение числа вхождений каждой отдельной буквы в строке sequence
. Это можно сделать следующим образом.
weights = {"A" => 331.0, "T" => 321.0, "G" => 347.0, "C" => 307.0}
sequence.each_char.
tally.
map { |c,n| n*weights[c] }.
sum.
fdiv(weights.values.sum)
#=> 24.120980091883613
Обратите внимание, что Enumerable # tally дебютировал в Ruby v2.7.
Шаги следующие:
e = sequence.each_char
#=> #<Enumerator: "AAGCA...CAT":each_char>
Мы можем преобразовать этот перечислитель в массив, чтобы увидеть значения, которые он сгенерирует, и передать tally
.
e.to_a
#=> ["A", "A", "G", "C", "A",..., "C", "A", "T"]
Продолжая,
h = e.tally
#=> {"A"=>32, "G"=>20, "C"=>11, "T"=>33}
a = h.map { |c,n| n*weights[c] }
#=> [10592.0, 6940.0, 3377.0, 10593.0]
t = a.sum
#=> 31502.0
b = weights.values.sum
#=> 1306.0
t.fdiv(b)
#=> 24.120980091883613
Обратите внимание, что если бы веса были равны, это вычислило бы простое среднее значений h
.