'inject' 是做什么的?
What does 'inject' do?
我一直在将一些 Ruby 代码翻译成 Python,但这让我很困惑。
有人可以分解一下这个 inject
函数的作用吗?
val = (0..seq.size - 2).inject(1.0) do |v, i|
v * rates[seq[i]][seq[i+1]]
end
相当于
val = 1.0
(0..seq.size - 2).each do |i|
val = val * rates[seq[i]][seq[i+1]]
end
在伪代码中,给定一个二维数组 "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)
inject
是 Ruby 中的一个“累加器”方法。如果你是第一次听到这个词,你可以看看 article. Here is the API doc for the method. Also an alias method of inject
is reduce
- 根据你使用它的上下文,你的代码可能会变得更易读并且有意义。
在您的示例中,1.0
值只是方法累积的起始值。例如,如果您的 seq
的长度为 3 ([1,2,3]
),您的循环将执行以下步骤:
1.0 *= rates[1][2] #=> i = 0
1.0*rates[1][2] *= rates[2][3] #=> i = 1 = seq.size - 2
在循环结束时将 return 累积的 val
变量。
我一直在将一些 Ruby 代码翻译成 Python,但这让我很困惑。
有人可以分解一下这个 inject
函数的作用吗?
val = (0..seq.size - 2).inject(1.0) do |v, i|
v * rates[seq[i]][seq[i+1]]
end
相当于
val = 1.0
(0..seq.size - 2).each do |i|
val = val * rates[seq[i]][seq[i+1]]
end
在伪代码中,给定一个二维数组 "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)
inject
是 Ruby 中的一个“累加器”方法。如果你是第一次听到这个词,你可以看看 article. Here is the API doc for the method. Also an alias method of inject
is reduce
- 根据你使用它的上下文,你的代码可能会变得更易读并且有意义。
在您的示例中,1.0
值只是方法累积的起始值。例如,如果您的 seq
的长度为 3 ([1,2,3]
),您的循环将执行以下步骤:
1.0 *= rates[1][2] #=> i = 0
1.0*rates[1][2] *= rates[2][3] #=> i = 1 = seq.size - 2
在循环结束时将 return 累积的 val
变量。