每个切片,地图,注射

2024-10-04 09:32:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图将这段Ruby代码翻译成Python,但我理解起来有困难。我理解各个部分,但我对Ruby还不熟悉,我很困惑它们是如何组合在一起的。在

#input: 16 bit array
hexes = input.each_slice(4).map.inject([]) { |sum, s| sum << s.join.to_i(2)}

如果有人能帮我破译这个,我将不胜感激! 谢谢你


Tags: to代码mapinputbitslicearrayinject
1条回答
网友
1楼 · 发布于 2024-10-04 09:32:17

您可以通过在交互式Ruby提示符(irb)中输入每个步骤来轻松地尝试这一点。在

假设input是:

["1", "0", "0", "1", 
 "0", "1", "0", "1", 
 "1", "0", "1", "0", 
 "0", "1", "1", "0"]

each_slice(4)将其分解为:

^{pr2}$

在这种情况下,map是不必要的,不做任何事情。在

inject与{}相同。你给它一个初始值,然后用这个值和列表的第一项调用块,然后调用结果和列表中的下一项,等等

所以它被称为:

[[], ["1", "0", "0", "1"]]
[[9], ["0", "1", "0", "1"]]
[[9, 5], ["1", "0", "1", "0"]]
[[9, 5, 10], ["0", "1", "1", "0"]]

最后返回[9, 5, 10, 6]。在

在Python中,最接近的等价物是非常非Python的:

reduce(
    (lambda sum, s: (sum.append(int(''.join(s), 2)) or sum))
    (input[i * 4:(i + 1) * 4] for i in range(4)),
    [])

所以你可以做一些类似的事情:

slices = (input[i * 4:(i + 1) * 4] for i in range(4))
sum = [int(''.join(s), 2) for s in slices]

在Ruby中哪个更好:

input.each_slice(4).map { |s| s.join.to_i(2) }

相关问题 更多 >