'注射'做什么?

时间:2018-06-05 22:14:37

标签: python ruby pseudocode

我一直在将一些Ruby代码翻译成Python,但这让我很难过。

有人可以分解这个inject函数正在做什么吗?

val = (0..seq.size - 2).inject(1.0) do |v, i|
  v * rates[seq[i]][seq[i+1]]
end

3 个答案:

答案 0 :(得分:2)

相当于

val = 1.0
(0..seq.size - 2).each do |i|
    val = val * rates[seq[i]][seq[i+1]]
end

答案 1 :(得分:2)

在伪代码中,给定2D数组“rates”和单个数组“seq”:

val = 1.0
for each consecutive pair(s,t) of values in seq:
    val = product * rates[s][t]

因此,如果seq = [1,2,3],则会提供产品rates[1][2] * rates[2][3]

在python中:

val = 1.0
for i in range(len(seq)-1):
     val*=rates[seq[i]][seq[i+1]]

reduce(lambda v,i: v*rates[seq[i]][seq[i+1]], range(len(seq)-1), 1.0) 

答案 2 :(得分:2)

inject是"累加器" Ruby中的方法。如果你是第一次听到这个词,你可以看一下这个article。以下是该方法的API doc。另外inject的{​​{3}}是reduce - 根据您使用它的上下文,您的代码可能会变得更具可读性和意义。

在您的示例中,1.0值只是累积的方法的起始值。例如,如果您的seq长度为3([1,2,3]),则您的循环将执行以下步骤:

  1. 1.0 *= rates[1][2] #=> i = 0
  2. 1.0*rates[1][2] *= rates[2][3] #=> i = 1 = seq.size - 2
  3. 最后,循环将返回累积的val变量。