Python 2.7: 在一行代码中遍历一个字符串的所有组合
Python 2.7: iterate over all combinations of a string in one line of code
我正在尝试遍历长度为 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
、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
在某种程度上仍然是 <itertools.imap object>
。我是一名自学的 Python 程序员,generators
、iterables
等有时让我感到困惑。有人可以帮我把迭代减少到一行吗?太感谢了。
如果您想跳出多个循环,可以使用 "return" 而不是 "break"
你已经很接近了,你需要 itertools.chain
到 "contatenate" 几个迭代器,例如:
alphabet = "ab"
for x in itertools.imap(''.join, itertools.chain(
*(itertools.product(alphabet, repeat=i)
for i in range(1,9)))):
print x
请注意,chain 接受参数列表,因此我将可变参数与生成器表达式一起使用。
编辑:使用评论中的 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 到 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
、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
在某种程度上仍然是 <itertools.imap object>
。我是一名自学的 Python 程序员,generators
、iterables
等有时让我感到困惑。有人可以帮我把迭代减少到一行吗?太感谢了。
如果您想跳出多个循环,可以使用 "return" 而不是 "break"
你已经很接近了,你需要 itertools.chain
到 "contatenate" 几个迭代器,例如:
alphabet = "ab"
for x in itertools.imap(''.join, itertools.chain(
*(itertools.product(alphabet, repeat=i)
for i in range(1,9)))):
print x
请注意,chain 接受参数列表,因此我将可变参数与生成器表达式一起使用。
编辑:使用评论中的 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