Python 2.7:在一行代码中迭代字符串的所有组合

时间:2015-12-07 03:47:17

标签: python generator permutation itertools

我正在尝试遍历长度为1到8(包括)的string的所有可能组合。 我的主要目标是让代码尽可能少。要做到这一点,我目前正在使用Python的itertools库:

import itertools, string
for i in xrange(1, 9):
    for x in itertools.imap(''.join, itertools.product(string.letters + string.digits + string.punctuation, repeat = i)):
        if x == some_string:
            # do something, like print x
            print x  
            break
    else:
        continue
    break

我希望能够在一行中进行迭代,因此我可以同时从内部和外部break循环中for,并且不需要{{1 }},else:continue等。像这样:(使用嵌套的break循环)

for

但是,for x in (itertools.imap(''.join, itertools.product(string.letters + string.digits + string.punctuation, repeat = i)) for i in xrange(1, 9)): if x == some_string: print x break 原来是x。所以我尝试使用更多嵌套的<itertools.imap object>循环迭代x(因为如果我使用内部for循环,我将再次for多次):

break

不幸的是,这仍然不起作用; for y in (x for x in (itertools.imap(''.join, itertools.product(string.letters + string.digits + string.punctuation, repeat = i)) for i in xrange(1, 9))): if y == some_string: print y break 在某种程度上仍然是y。我是一名自学成才的Python程序员,而<itertools.imap object>generators等等有时让我感到困惑。有人可以帮我把迭代降到一行吗?非常感谢。

2 个答案:

答案 0 :(得分:2)

你非常接近,你需要itertools.chain来“连接”几个迭代器,如:

alphabet = "ab"

for x in itertools.imap(''.join, itertools.chain(
          *(itertools.product(alphabet, repeat=i)
            for i in range(1,9)))):
    print x

请注意,链接受一个参数列表,因此我使用带有生成器表达式的varargs。

编辑:使用评论中的itertools.chain.from_iterable

from itertools import chain, imap, product

alphabet = "ab"

for x in imap(''.join, chain.from_iterable(product(alphabet, repeat=i)
                             for i in range(1,9))):
    print x

答案 1 :(得分:0)

如果你想打破多个循环,可以使用&#34; return&#34;而不是&#34;打破&#34;