【问题标题】:generator for a, b, aa, ab, ba, bb, aaa, aaba、b、aa、ab、ba、bb、aaa、aab 的生成器
【发布时间】:2019-09-30 17:24:22
【问题描述】:

这个:

import itertools

gen1 = itertools.product('ab', repeat=3)
for i in gen1:
    print(''.join(i), end=' ')

打印这个:

aaa aab aba abb baa bab bba bbb 

但我也希望它生成a b aa ab ba bb。我可以这样做:

import itertools

for i in range(1, 4):
    gen2 = itertools.product('ab', repeat=i)
    for j in gen2:
        print(''.join(j), end=' ')

打印这个:

a b aa ab ba bb aaa aab aba abb baa bab bba bbb 

有没有更优雅的方法来使用单个生成器获取此输出?比如:

import itertools

gen3 = (your code here)
for i in gen3:
    # prints forever in the pattern: a b aa ab ba bb aaa aab aba abb baa bab bba bbb
    print(''.join(i), end=' ')

【问题讨论】:

  • 您的评论“永久打印”重要吗?
  • @tomjn 我会说是的,因为我希望能够将其推广到任何长度的 'a's 和 'b's。我应该明确一点,当我说“永远打印”时,我的意思是它会继续用 aaaa aaab aaba....

标签: python python-3.x generator itertools


【解决方案1】:

我会将多个迭代器链接在一起:

from itertools import chain, product


gens = chain.from_iterable(product('ab', repeat=i) for i in range(1,4))
for i in gens:
  print(''.join(i), end=' ')

如果需要,可以通过将range(1,4) 替换为itertools.count(1),将其扩展到无限的值序列。

如果您的“永远打印”注释意味着您想在 bbb 之后返回到 a,则将链式迭代器包装在 itertools.cycle 中。

【讨论】:

  • 是的!这正是我想要的。比其他方式优雅得多。现在我可以将所有东西都放在一个生成器中:gens = itertools.chain.from_iterable(itertools.product('ab', repeat=i) for i in itertools.count(1))
猜你喜欢
  • 2022-11-18
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2012-08-22
  • 1970-01-01
  • 2012-09-23
  • 2018-09-07
  • 2015-02-28
相关资源
最近更新 更多