【发布时间】:2015-12-07 03:47:16
【问题描述】:
我正在尝试遍历长度为 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 循环中取出,并且不需要else:、continue、@ 987654328@ 等类似这样的东西:(使用嵌套的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 在某种程度上仍然是 <itertools.imap object>。我是一名自学的 Python 程序员,generators、iterables 等有时让我感到困惑。有人可以帮我把迭代降到一行吗?非常感谢。
【问题讨论】:
-
遍历所有这些组合是一种可怕的检查
some_string是否是其中之一的方法。 -
我同意;然而,这是我得到的任务。
-
这样......你将拥有
Memory Error, -
@IronFist 确实如此。不过,就目前而言,内存/效率对我来说不是问题。我的工作是压缩程序。感谢您指出这一点。
标签: python generator permutation itertools