Python的izip_longest在Ruby中的等价方法

4

我正在学习Ruby编程语言。目前,我有一个列表的列表,希望能够实现以下Python代码的等效功能:

import itertools
l = [[1,2], [3], [10, 20, -4, 5]]
list(itertools.izip_longest(*l, fillvalue='NaN'))

结果如下:
[(1, 3, 10), (2, 'NaN', 20), ('NaN', 'NaN', -4), ('NaN', 'NaN', 5)]

列表l中的列表数量可能不同。在Ruby中是否有一种简单的方法来实现相同的功能?

1
不同的编程语言有不同的习惯用语,Ruby 有数组、map、join、to_str 和 lambda 等功能,可以将其转换为字符串,如果您解释您想要做什么,这些功能可能会很有用... - ChuckCottrill
我想要做的就是完全按照Python中所展示的方式。我有几个值列表,将会逐对使用逗号将每个元素连接起来,如果某个列表比其他列表小,相应的元素将被替换为空字符串。 - skeept
@ChuckCottrill:虽然一般来说是这样,但在这种情况下它们并不是那么不同。Python将它们称为列表、映射、连接、字符串和lambda,而map和str是函数而不是方法,但除此之外它们基本上是相同的(这并不奇怪,因为大多数这些东西,Ruby要么直接从Python借鉴,要么从与Python相同的来源借鉴)。 - abarnert
顺便提一下,在与 zip_longest 无关的问题中引入所有这些额外的 Python 特定复杂性,只会吓跑90%的 Ruby 魔法师,他们本来可以如数家珍的知道答案。由于 Python 代码不是很Pythonic(使用lambda而不是def,但在任何情况下都给结果命名?在使用更复杂的map调用之前避免微不足道的map(str, x)?在不需要的地方添加额外的括号?),即使是一些知道一点Ruby的 Python巫师也会被吓到。 - abarnert
@ChuckCottrill 我承认在这里使用izip_longest的完全等效可能不是最好的选择,这就是为什么我有一个完整的示例来说明我想做的事情。 - skeept
显示剩余3条评论
1个回答

4

我认为Ruby标准库中没有直接对应izip_longest的函数。

l = [[99,2], [3], [10, 20, -4, 5]]
n = l.map{ |x| x.size }.max
(0...n).map { |i| l.map { |x| x.fetch(i, 'NaN') } }
# => [[99, 3, 10], [2, "NaN", 20], ["NaN", "NaN", -4], ["NaN", "NaN", 5]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接