我正在尝试遍历长度为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
等等有时让我感到困惑。有人可以帮我把迭代降到一行吗?非常感谢。
答案 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;