我正在寻找一种与 Ruby 中 Python 的 itertools.product
具有相同效果的方法。采用以下 Python 代码:
from itertools import product
chars = []
for i in range(97,123):
chars.append(chr(i))
for a in range(1,3):
for i in product(chars,repeat=a):
s = ''.join(i)
print s
输出是这样的:
a, b, c... x, y, z, aa, ab, ac... ax, ay, az, ba, bb, bc.. etc.
我试着把它翻译成 Ruby:
(1..2).each do |n|
('a'..'z').to_a.combination(n).each do |c|
s = c.join
puts s
end
end
但输出不一样。一个字符的工作正常 (a-z),但是当它进入两个字符的时候,它就不能像我预期的那样工作:
ab, ac, ad.. ax, ay, az, bc, bd, be
它没有生成 aa
、ba
或 bb
- 所以看起来它生成的所有组合都没有重复字符之类的东西?
那么我应该使用什么方法来生成 所有 像 itertools.product
在 Python 中那样的组合呢?
最佳答案
我会写(简化为 3 个元素,需要 Ruby 1.9):
xs = ["a", "b", "c"]
strings = 1.upto(xs.size).flat_map do |n|
xs.repeated_permutation(n).map(&:join)
end
#=> ["a", "b", "c", "aa", "ab", "ac", ..., "cca", "ccb", "ccc"]
懒惰的解决方案:您可以轻松地使用 each
而不是 map
来编写它,但是让我们检查一下 Ruby 2.0 中的“懒惰”:
xs = ("a".."z").to_a
strings = 1.upto(xs.size).lazy.flat_map do |n|
xs.repeated_permutation(n).lazy.map(&:join)
end
关于python - Python 的 itertools.product 在 Ruby 中的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10211293/