python - Python 的 itertools.product 在 Ruby 中的等价物是什么?

标签 python ruby arrays python-itertools

我正在寻找一种与 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

它没有生成 aababb - 所以看起来它生成的所有组合都没有重复字符之类的东西?

那么我应该使用什么方法来生成 所有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/

相关文章:

javascript - 为什么我在定义的数组上收到 "ERROR TypeError: Cannot read property ' length' of undefined"?

python - 芬尼克斯 : applying force on a particular point

python - 模板渲染 Django 1.6 期间的 Dijan 错误

mysql - 无法在 Linux (CentOS) 上安装 "mysql2"gem

ruby-on-rails - 有没有更 ruby 的方式来做这个逻辑

C++ 泛型数组实现

python - 如何在 Django 中正确抛出 ValidationError?

python - 如何矢量化 Pandas 函数,该函数计算属于一个组且介于两个日期之间的行?

ruby - 部署路径不适用于中间人部署中的 Git 部署方法

c - 将整个数组传递给函数时获取垃圾值