Ruby中与Python itertools相当的是什么?尤其是组合/排列/groupby?

14

Python的itertools模块提供了很多关于使用生成器来处理可迭代对象/迭代器的好东西。例如,

permutations(range(3)) --> 012 021 102 120 201 210

combinations('ABCD', 2) --> AB AC AD BC BD CD

[list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D

在Ruby中有什么等效的东西?

所谓等效,是指快速和内存高效(Python的itertools模块是用C编写的)。

1个回答

20

Array#permutationArray#combinationEnumerable#group_by自1.8.7版本以来就在Ruby中定义了。 如果您正在使用1.8.6,您可以从facets、active_support或backports获取等效的方法。

示例用法:

[0,1,2].permutation.to_a
#=> [[0, 1, 2], [0, 2, 1], [1, 0, 2], [1, 2, 0], [2, 0, 1], [2, 1, 0]]

[0,1,2,3].combination(2).to_a
#=> [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]

[0,0,0,1,1,2].group_by {|x| x}.map {|k,v| v}
#=> [[0, 0, 0], [1, 1], [2]]

[0,1,2,3].group_by {|x| x%2}
#=> {0=>[0, 2], 1=>[1, 3]}

6
请注意,group_by 和 itertools.groupby 的工作方式非常不同。[0,0,1,1,0,0].group_by 会得到2个组,而 itertools.groupby 则会得到3个组。 - John La Rooy
1
itertools.chain怎么样? - Incerteza

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